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

MongoDB Find无返回,Node.js+Express Promise异步问题求助

问题分析与修复方案

核心错误点

  • 未等待Promise完成:getUsers返回的是Promise对象,你直接赋值给docs后就打印和响应,此时Promise还处于pending状态,所以console.log输出[object Promise],res.send发送的也是未解析的Promise,导致浏览器拿到无效数据。
  • 对resolve方法的错误理解:resolve(docs)的返回值是undefined,你把它赋值给result并打印、返回完全没必要,resolve只是用来标记Promise成功完成并传递数据,不会返回实际结果。

修复后的代码

1. 修正getUsers函数

可以直接利用MongoDB方法的Promise特性,无需手动封装Promise:

function getUsers(db) {
  return db.collection("Users").find().toArray();
}

或者保留手动封装写法(去掉无效的resolve返回值处理):

function getUsers(db) {
  return new Promise(function(resolve, reject) {
    db.collection("Users").find().toArray(function(err, docs) {
      if (err) {
        return reject(err);
      }
      // 直接resolve数据即可,不需要接收返回值
      resolve(docs);
    });
  });
}

2. 修正Express路由处理

使用async/await等待Promise解析,同时添加错误捕获:

ourApp.post('/Users', async function(req, res) {
  try {
    const db = client.db(dbName);
    console.log("Connected correctly to server");

    // 用await等待Promise完成,拿到实际数据
    const docs = await getUsers(db);
    
    console.log("After call:", docs);
    res.send(docs);
  } catch (err) {
    // 捕获错误并返回500响应
    console.error("获取数据失败:", err);
    res.status(500).send("获取用户数据失败");
  }
});

为什么之前会输出undefined

你在getUsers里执行var result = resolve(docs);,然后console.log(result);,而resolve()方法本身的返回值就是undefined,所以这行打印会输出undefined,这和异步操作本身无关,只是对API的误解导致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:30:49