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
相关产品推荐
相关产品推荐

