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

