Mongoose不再接受回调函数,改用then/catch仍报错求解决
解决Mongoose不再接受回调函数的问题
Mongoose 6.x及以上版本已移除查询方法对回调函数的支持,所有CRUD操作默认返回Promise,因此需要用Promise链式调用或async/await语法重构代码。以下是针对你代码的两种修复方案:
方案一:使用then/catch链式调用
注意要将res.redirect("/")放在insertMany的then回调内,确保数据插入完成后再跳转,避免逻辑错误:
app.get("/", function (req, res) { Item.find({}) .then(foundItems => { if (foundItems.length === 0) { Item.insertMany(defaultItems) .then(() => { console.log("Successfully saved default items to DB."); res.redirect("/"); }) .catch(err => { console.log(err); res.status(500).send("插入默认数据失败"); }); } else { res.render("list", { listTitle: "Today", newListItems: foundItems }); } }) .catch(err => { console.log(err); res.status(500).send("获取数据失败"); }); });
方案二:使用async/await(推荐,更简洁易读)
将路由处理函数改为async函数,配合try/catch捕获所有异步操作的错误:
app.get("/", async function (req, res) { try { const foundItems = await Item.find({}); if (foundItems.length === 0) { await Item.insertMany(defaultItems); console.log("Successfully saved default items to DB."); res.redirect("/"); } else { res.render("list", { listTitle: "Today", newListItems: foundItems }); } } catch (err) { console.log(err); res.status(500).send("服务器错误"); } });
关键注意事项
- 所有异步操作必须等待Promise完成后再执行后续逻辑,避免出现数据未插入就跳转的情况
- 必须添加错误捕获逻辑,防止未处理的Promise rejection导致程序崩溃
- Mongoose 6+彻底废弃了回调写法,后续开发都需要使用Promise或async/await语法
内容的提问来源于stack exchange,提问作者Wojtek
相关产品推荐
相关产品推荐

