You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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");
  })
}

额外优化&说明:

  1. 关于await的疑问:完全不需要导入额外模块!只要在async标记的函数内部使用await就可以正常工作,你的控制器函数已经是async的了,这部分没问题。
  2. 简化代码:其实Mongoose的查询方法本身就支持Promise,你可以省去手动包裹Promise的步骤,让代码更简洁:
getResult1: (param) => {
  return MongoSchema1.findById(param)
    .select("field1 field2")
    .then(result => result || {})
    .catch(error => { throw error; });
}
// getResult2同理

内容的提问来源于stack exchange,提问作者kovac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:24:00