Node.js通过GET请求从MongoDB取数返回undefined问题排查
问题分析与解决:Express+MongoDB GET接口返回undefined及连接池错误
核心问题
- 返回值丢失:原代码中
await cursor.toArray().then(...)的return docs仅在回调函数内部生效,并没有让外层的returnData异步函数获取到这个值,导致整个函数默认返回undefined。 - 连接提前关闭:最后一种写法里,
return cursor.toArray()后finally立刻执行client.close(),但cursor.toArray()是异步操作,还未完成就关闭了连接池,触发了连接池已关闭的错误。
修正后的完整代码
app.get('/getData', async (req, res) => { try { const result = await returnData(); res.send(result); } catch (err) { res.status(500).send({ error: err.message }); } }); async function returnData() { const uri = `mongodb+srv://username:password@connection-url/?retryWrites=true&w=majority`; const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { await client.connect(); const database = client.db('testDB'); const collection = database.collection('testCollection'); // 直接用await获取查询结果,避免嵌套回调导致的返回值丢失 const docs = await collection.find({}).toArray(); return docs; } catch (e) { console.error(e); throw e; // 抛出错误让接口层处理 } finally { await client.close(); } }
关键修改点
- 移除多余的
then嵌套回调,直接通过await接收查询结果并返回,确保returnData函数能正确输出数据。 - 接口层改用
async/await语法,并添加错误捕获,避免未处理的异常导致服务器崩溃。 - 在数据库查询的错误分支中添加
throw e,将错误传递到接口层,方便返回标准化的错误响应。
内容的提问来源于stack exchange,提问作者Wriar
相关产品推荐
相关产品推荐

