在Vapor 4中,我正在通过在第三方API上调用请求并根据返回的结果返回值来处理发布请求。以下代码导致错误:“从投掷函数...到非投掷函数的无效转换”
app.post("activate") { req -> EventLoopFuture<ActivationRequestResponse> in
return req.client.post("https://api.example.com/activation", headers: HTTPHeaders(), beforeSend: { (req) in
try req.content.encode(RequestBody(value: someValue), as: .json)
})
.map { (response) -> ActivationRequestResponse in
let response = try response.content.decode(ResponseModel.self)
return ActivationRequestResponse(success: true, message: "success")
}
}
在获得API结果后,我似乎无法在链接的try
中使用map()
。如果我在地图内的!
中的try
中添加了let response = try response.content.decode(ResponseModel.self)
,则上面的代码将起作用,但理想情况下,我想捕获此错误。创建响应正文时使用的第一个try
似乎是隐式地传递回了链,但不是第二个。
我做错了什么?解码响应内容时如何捕获错误?为什么捕获到第一个try
而不捕获第二个?
map
的属性是它将仅转换“成功路径”上的值。但是,您的转换可能会失败,这意味着您大概也希望未来也会失败。
无论何时要使用成功或失败的函数转换值,都需要使用flatMap*
函数之一。
根据您的情况,尝试将map
替换为flatMapThrowing
,然后它应该可以工作。