Swift Vapor:未等待 catchMap

Swift Vapor: catchMap not being awaited

我在控制器中有以下代码部分,它查询 MailGun 以发送电子邮件,然后理想情况下应该等待响应,然后再返回控制器。按照现在的配置,这个 应该 失败,因为我故意破坏了我的 MailGun 配置。但是目前控制器正在返回成功状态,因为没有正确等待 .catchMap 功能,而且我不确定如何正确构建我的代码,以便它是。

return emailTemplate.render(emailData, on: req).map { message -> Future<Response> in
    let deliveryService = try req.make(EmailDeliveryService.self)
    return try deliveryService.send(message, on: req)
}.catchMap { error in
    /// this is not being awaited, and no abort is thrown before the request returns
    throw Abort(.internalServerError, reason: "Error sending email.")
}.transform(to: savedObj)

应该正确等待的函数,deliverService.send,具有方法签名:

func send(_ message: EmailMessage, on container: Container) throws -> Future<Response>

我如何适当地构造此代码以正确捕获由 deliveryService.send 方法的结果返回的错误?

如果您的 render() 方法签名是这样的:

func render(…) -> Future<String>

那么,我认为您需要在

中使用 flatMap 而不是 map
return emailTemplate.render(emailData, on: req).map // <—

现在,catchMaptransform 方法正在接收 Future<Future<Response>>,因为 map 仅转换给定未来的封装数据,如下所示:

Future<String> -map(String -> Future<Response)-> Future<Future<Response>>

使用flatMap,它会展平双Future,这就是这个方法的目的,导致:

Future<String> -flatMap(String -> Future<Response)-> Future<Response>

那么,catchMap就可以访问错误了