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

Node.js中调用MongoDB异步方法无法正确返回数据如何解决

问题修复说明

问题根源

  • 代码混用了MongoDB驱动的回调式异步API和async/await异步范式,getItemsFromCollection函数在collection.find({}).toArray的回调执行前就已经将空的itemArr返回,导致调用方拿到的永远是空数组。
  • 函数声明了async关键字但没有搭配await使用,相当于把同步返回的空数组包装为Promise返回,无法获取异步查询的结果。

修复方案

修改封装的db方法

MongoDB Node.js驱动原生支持Promise化调用,直接用await等待toArray执行完成即可,不需要手动维护数组、写回调逻辑:

getItemsFromCollection: async function(collectionName) {
    const collection = client.db().collection(collectionName);
    const itemArr = await collection.find({}).toArray();
    console.log(itemArr);
    return itemArr;
},

优化路由层代码(可选推荐)

建议补充错误捕获逻辑和响应返回,避免请求挂起、服务崩溃:

router.route('/').get(async (req, res) => {
    try {
        const itemArr = await db.getItemsFromCollection("Plants");
        console.log(itemArr);
        // 给前端返回查询结果
        res.json(itemArr);
    } catch (err) {
        console.error('数据查询失败:', err);
        res.status(500).json({ error: '查询失败' });
    }
});

原写法错误说明

  • 注释掉的forEach写法存在同样问题:collection.find()返回游标,forEach是异步操作,还没遍历完所有文档就提前返回了空数组。
  • 回调式的toArray不会阻塞后续代码执行,return itemArr运行时回调还未触发,itemArr还未被赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 22:57:04