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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:12:22