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

Mongoose异步查询结果赋值变量失效问题及解决方法

解决Mongoose查询后变量赋值失效(输出undefined)的问题

我太懂你踩的这个坑了——这完全是JavaScript异步代码的执行顺序在搞事情!

为什么初始代码会输出undefined?

你的初始代码里,projectsModel.find()是个异步操作:它会发起数据库查询,但不会阻塞后续代码的执行。而你后面的console.log(projectsDocument)是同步代码,会在数据库查询完成、回调函数执行之前就跑起来。这时候projectsDocument还没被赋值,自然输出undefined。

拆解下初始代码的执行顺序:

  1. 声明空变量projectsDocument和categoryDocument
  2. 调用projectsModel.find(),发起异步数据库请求,JavaScript直接跳过这个回调,继续往下执行
  3. 执行console.log(projectsDocument),此时回调还没触发,变量还是初始的undefined
  4. 一段时间后数据库查询完成,回调函数执行,才给projectsDocument赋值,但这时候console.log早就执行完了

为什么修改后的代码能解决问题?

你改成async/await结合.then()的写法后,await关键字会让JavaScript暂停当前函数的执行,直到projectsModel.find()这个异步操作完成、拿到结果后再继续。这样.then()里的赋值操作会在查询完成后执行,后续如果需要使用projectsDocument,它就已经有正确的值了。

补充一个更简洁规范的写法

其实可以不用.then(),直接用await接收查询结果,搭配try/catch处理错误,代码会更清晰:

router.get('/', async(req, res, next) => {
  try {
    // 直接用await接收find()的返回值,无需回调或then
    const projectsDocument = await projectsModel.find({});
    // 这里可以放心使用projectsDocument了
    console.log(projectsDocument);
    // 比如把数据传给前端
    res.json(projectsDocument);
  } catch (error) {
    console.error('查询出错:', error);
    next(error); // 把错误传递给错误处理中间件
  }
});

内容的提问来源于stack exchange,提问作者Amir Mohammad Rivand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:18:11