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

Node.js中MongoDB数据查询函数返回undefined问题求助

问题解决:Node.js + Express + MongoDB异步返回undefined的问题

问题根源

你的代码里的getRoomReadings函数存在异步操作未正确处理的问题:

  • MongoDB的connect和find().toArray()都是异步回调式操作,函数执行时会立刻返回,不会等待异步操作完成
  • 回调函数里的return result只是在回调内部生效,不会把结果传递到getRoomReadings函数的外部调用处
  • 所以外部调用getRoomReadings时,直接拿到的是函数默认返回的undefined

解决方案:用Promise + Async/Await处理异步逻辑

将异步操作封装成Promise,再用async/await语法同步化调用流程,确保能正确获取异步结果。

修改后的代码示例

1. 重构getRoomReadings为Promise风格函数

const mongoUrl = "mongodb://192.168.8.156:27017/";

const getRoomReadings = function (id) {
  return new Promise((resolve, reject) => {
    MongoClient.connect(mongoUrl, (err, db) => {
      if (err) {
        db?.close(); // 出错时关闭数据库连接
        return reject(err);
      }
      const dbo = db.db(`room${id}`);
      dbo.collection("env").find({}).toArray((err, result) => {
        db.close(); // 操作完成后关闭连接
        if (err) return reject(err);
        resolve(result);
      });
    });
  });
};

2. 在Express路由中用Async/Await调用

// API RoomX route
app.get("/api/r:id", async (req, res) => {
  try {
    const rez = await getRoomReadings(req.params.id);
    console.log(rez);
    res.json(rez); // 将结果返回给客户端
  } catch (err) {
    console.error("获取数据失败:", err);
    res.status(500).json({ error: "服务器内部错误,无法获取数据" });
  }
});

更简洁的Async/Await版本

也可以直接用async函数重写getRoomReadings,代码更易读:

const getRoomReadings = async function (id) {
  let db;
  try {
    db = await MongoClient.connect(mongoUrl);
    const dbo = db.db(`room${id}`);
    return await dbo.collection("env").find({}).toArray();
  } catch (err) {
    throw err;
  } finally {
    if (db) await db.close(); // 确保无论成功失败都关闭连接
  }
};

关键注意事项

  • 必须处理异步操作的错误,不能直接throw err,否则会导致Express服务器崩溃,需用try/catch捕获并返回错误响应
  • 数据库连接使用后要及时关闭,避免连接泄漏
  • Async/Await语法需要在async函数内部使用,所以Express路由回调要声明为async函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:55:15