Node应用多请求时MongoDB偶发崩溃,分类路由无法读取_id报错
问题原因
- 混用了Mongoose的回调写法和async/await语法,两者同时使用时await的等待逻辑不会生效。你给
findOne同时传了回调函数,这时Mongoose返回的不是可等待的Promise,await不会等数据库查询完成就会直接执行后续代码。首次请求可能刚好查询速度够快,catItem被成功赋值,后续请求查询耗时稍长就会出现catItem还没被赋值就执行Product.find的情况,自然就会读到undefined的_id属性。 - 没有做查询结果为空的判断,如果
Category.findOne没有匹配到对应分类,foundItem本身就是null,也会触发这个报错。 - 没有统一的错误捕获逻辑,异步操作的错误没有被处理,才会抛出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
相关产品推荐
相关产品推荐

