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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:45:04