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

Node应用多请求时MongoDB偶发崩溃,分类路由无法读取_id报错

问题原因

  1. 混用了Mongoose的回调写法和async/await语法,两者同时使用时await的等待逻辑不会生效。你给findOne同时传了回调函数,这时Mongoose返回的不是可等待的Promise,await不会等数据库查询完成就会直接执行后续代码。首次请求可能刚好查询速度够快,catItem被成功赋值,后续请求查询耗时稍长就会出现catItem还没被赋值就执行Product.find的情况,自然就会读到undefined的_id属性。
  2. 没有做查询结果为空的判断,如果Category.findOne没有匹配到对应分类,foundItem本身就是null,也会触发这个报错。
  3. 没有统一的错误捕获逻辑,异步操作的错误没有被处理,才会抛出UnhandledPromiseRejectionWarning警告。

修复方案

直接移除回调函数,统一用async/await的写法,加上错误捕获和空值判断,修复后的代码如下:

app.get("/categories/:catName", async function(req, res) {
  try {
    const name = req.params.catName;
    console.log(name);
    // 移除回调,直接await拿到查询结果
    const catItem = await Category.findOne({ name: name });
    // 先判断分类是否存在
    if (!catItem) {
      return res.status(404).send("对应分类不存在");
    }
    // 同样移除回调,await拿到商品结果
    const foundItems = await Product.find({ category: catItem._id });
    res.render("category.ejs", { category: catItem, products: foundItems });
  } catch (err) {
    // 统一捕获所有异步操作的错误
    console.log(err);
    res.status(500).send("服务器内部错误");
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:21:02