Vapor项目报错Cannot convert EventLoopFuture<String>为String如何解决?
报错根因
你使用的flatMapThrowing算子要求闭包返回非Future的普通值,而else分支返回的是EventLoopFuture<String>类型,二者类型不匹配,所以触发报错。需要调整算子类型,统一两个分支的返回值类型。
修正后完整代码
app.get("user", ":uuid") { req throws -> EventLoopFuture<String> in let uuid = req.parameters.get("uuid") ?? "" return User.query(on: req.db).filter(\.$uuid == uuid).first().flatMap { user in // 先捕获当前eventLoop避免跨线程调用问题 let eventLoop = req.eventLoop do { if let user = user { // 普通返回值包装为EventLoopFuture let res = try Response(data: ["user": user.makeDictionary()]) return eventLoop.makeSucceededFuture(res) } else { // 原有Future返回逻辑直接保留 return User.query(on: req.db).all() .map { $0.map { $0.makeDictionary() } } .flatMapThrowing { dicArray in return try Response(data: ["users": dicArray]) } } } catch { // 错误统一包装为失败的Future return eventLoop.makeFailedFuture(error) } } }
核心调整点
- 将外层的
flatMapThrowing替换为flatMap,允许闭包返回EventLoopFuture类型的结果 - 存在匹配用户的分支中,用
eventLoop.makeSucceededFuture将普通字符串返回值包装为EventLoopFuture类型,保证if/else两个分支返回类型完全一致 - 新增错误捕获逻辑,把可能抛出的序列化错误包装为失败的
EventLoopFuture,符合flatMap的类型要求
内容的提问来源于stack exchange,提问作者workhard
相关产品推荐
相关产品推荐

