Mongoose 7不再支持回调函数,如何更新该查询代码?
适配Mongoose 7的Express路由代码改造
以下是你提供的原代码,它使用了Mongoose的回调函数API,但Mongoose 7已不再支持这类回调写法:
app.get("/", function(req, res) { Item.find({}, function(err, foundItems) { if (foundItems.lengh === 0) { Item.insertMany(defaultItems, function(err) { if (err) { console.log(err); } else { console.log("Successfully saved default items"); } }); res.redirect("/"); } else { res.render("list", { listTitle: "Today", newListItems: foundItems }); } }); });
核心问题与改造方案
Mongoose 7彻底移除了回调函数支持,同时原代码还存在两个细节问题:lengh是拼写错误(应为length),且insertMany执行后立即重定向会导致数据未完成插入就跳转。我们可以用async/await替代回调,这也是Mongoose官方推荐的写法:
app.get("/", async (req, res) => { try { // 用await等待查询结果,替代find的回调 const foundItems = await Item.find({}); if (foundItems.length === 0) { // 等待批量插入完成再执行后续操作 await Item.insertMany(defaultItems); console.log("Successfully saved default items"); res.redirect("/"); } else { res.render("list", { listTitle: "Today", newListItems: foundItems }); } } catch (err) { // 统一捕获所有数据库操作的错误 console.log(err); res.status(500).send("服务器错误"); } });
关键改动说明
- 将路由处理函数声明为
async函数,使用await等待Mongoose异步操作完成,代码逻辑更线性易读 - 移除所有嵌套回调,改用
try/catch块统一处理错误,避免回调地狱 - 修正
lengh的拼写错误为length - 在
insertMany前添加await,确保数据完全插入后再重定向,避免数据不一致 - 新增错误响应分支,当数据库操作失败时返回500状态码,提升接口健壮性
内容的提问来源于stack exchange,提问作者Guri Shubitidze
相关产品推荐
相关产品推荐

