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 // <—
现在,catchMap
和 transform
方法正在接收 Future<Future<Response>>
,因为 map
仅转换给定未来的封装数据,如下所示:
Future<String> -map(String -> Future<Response)-> Future<Future<Response>>
使用flatMap
,它会展平双Future,这就是这个方法的目的,导致:
Future<String> -flatMap(String -> Future<Response)-> Future<Response>
那么,catchMap
就可以访问错误了
我在控制器中有以下代码部分,它查询 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 // <—
现在,catchMap
和 transform
方法正在接收 Future<Future<Response>>
,因为 map
仅转换给定未来的封装数据,如下所示:
Future<String> -map(String -> Future<Response)-> Future<Future<Response>>
使用flatMap
,它会展平双Future,这就是这个方法的目的,导致:
Future<String> -flatMap(String -> Future<Response)-> Future<Response>
那么,catchMap
就可以访问错误了