使用async/await时异步返回结果为undefined的问题排查
问题根源:模型函数未返回Promise对象
嘿,这个问题其实挺典型的,我一眼就找到症结所在啦!
你遇到的核心问题是模型中的getResult1和getResult2函数没有返回创建的Promise实例,导致控制器里的await根本没有等待数据库查询完成,直接就继续执行后续代码了。
具体分析:
看你的模型代码,每个函数里都创建了new Promise(...),但没有用return把这个Promise返回出去。JavaScript函数如果没有显式返回值,默认会返回undefined。所以当你在控制器里写await myModel.getResult1(param)时,其实是在await undefined——这会直接解析为undefined,完全不会等待数据库的异步操作完成。
这就解释了所有异常现象:
- 控制器里的
console.log先执行:因为没有等待真正的异步任务,代码直接往下走了 result1和result2始终是undefined:因为await的是undefined,自然拿不到数据库结果- 模型里的
console.log能看到正确结果:数据库查询确实完成了,但这个结果没有传递回控制器
修正后的模型代码:
只需要给每个模型函数加上return,把创建的Promise返回出去就行:
getResult1: (param) => { // 关键:加上return返回Promise实例 return new Promise((resolve, reject) => { MongoSchema1.findById(param, (error, result) => { if (error) return reject(error); resolve(result ? result : {}); }).select("field1 field2"); }) } getResult2: (param) => { // 关键:加上return返回Promise实例 return new Promise((resolve, reject) => { MongoSchema2.findById(param, (error, result) => { if (error) return reject(error); resolve(result ? result : {}); }).select("field1 field2"); }) }
额外优化&说明:
- 关于
await的疑问:完全不需要导入额外模块!只要在async标记的函数内部使用await就可以正常工作,你的控制器函数已经是async的了,这部分没问题。 - 简化代码:其实Mongoose的查询方法本身就支持Promise,你可以省去手动包裹Promise的步骤,让代码更简洁:
getResult1: (param) => { return MongoSchema1.findById(param) .select("field1 field2") .then(result => result || {}) .catch(error => { throw error; }); } // getResult2同理
内容的提问来源于stack exchange,提问作者kovac
相关产品推荐
相关产品推荐

