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

Node.js通过GET请求从MongoDB取数返回undefined问题排查

问题分析与解决:Express+MongoDB GET接口返回undefined及连接池错误

核心问题

  1. 返回值丢失:原代码中await cursor.toArray().then(...)的return docs仅在回调函数内部生效,并没有让外层的returnData异步函数获取到这个值,导致整个函数默认返回undefined。
  2. 连接提前关闭:最后一种写法里,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:50:21