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

MongoDB与Node.js新手求助:代码出现unhandled promise rejection原因排查

解决你的Unhandled Promise Rejection问题

嘿,我来帮你拆解下代码里导致这个问题的核心原因,再给你一个修复后的版本:

首先,咱们先梳理下你代码里的几个关键问题:

  • 异步回调里的throw err无法被正确捕获:你在MongoClient.connect和find的回调中使用throw err,但这些回调是异步执行的,Express的错误处理机制根本抓不到这些错误,Node.js会把这类未捕获的异步错误标记为"未处理Promise拒绝"。
  • find()返回的是游标而非结果数组:你现在直接访问result.Name、把result传给res.json()都是错误的——find()返回的是MongoDB的游标对象,必须先调用.toArray()把它转换成实际的文档数组才能使用。
  • 重复引入+连接未复用:你顶部已经require过MongoClient了,路由里又重复引入一次完全没必要;而且每次请求都新建数据库连接,不仅性能拉胯,还可能因为连接没正确关闭导致资源泄漏。

下面是修复后的代码,我改成了更易维护的async/await风格,同时解决了所有问题:

const express = require("express");
const router = express.Router();
const { MongoClient } = require("mongodb"); // 解构引入更清晰
const bodyParser = require("body-parser");

// 提前创建MongoDB客户端实例,复用连接(这是生产环境的推荐做法)
const mongoClient = new MongoClient("mongodb://localhost:27017/");

router.get("/users", async (req, res) => {
  try {
    // 连接数据库(如果已经建立连接会直接复用)
    await mongoClient.connect();
    const dbo = mongoClient.db("TestDB");
    
    // 将游标转换为用户文档数组
    const users = await dbo.collection("users").find({}).toArray();
    
    console.log(users); // 现在能看到完整的用户列表了,单个用户的Name可以用users[0]?.Name访问
    res.json(users);
  } catch (err) {
    // 统一捕获所有错误,返回友好的错误响应
    console.error("获取用户列表失败:", err);
    res.status(500).json({ error: "获取用户列表失败,请稍后重试" });
  } finally {
    // 可选:如果不需要长期保持连接,可在此关闭,但更推荐复用连接
    // await mongoClient.close();
  }
});

module.exports = router;

最后给你两个小建议:

  • 把数据库连接字符串放到环境变量里,不要硬编码在代码中,更安全也更灵活。
  • 生产环境中不要把原始错误信息返回给客户端,避免泄露敏感的数据库细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:04:31