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

求助:Model.prototype.save()回调报错及npm清理无用依赖方法

一、解决Model.prototype.save() no longer accepts a callback报错

问题根源

Mongoose 6.x及以上版本彻底移除了save()方法的回调参数支持,只能用Promise链式调用或async/await语法处理异步逻辑。

具体修复方案

1. 改用Promise链式调用

错误示例代码(旧写法):

const product = new Product({ name: "示例商品", price: 99 });
product.save((err, savedDoc) => {
  if (err) console.error(err);
  else console.log("保存成功", savedDoc);
});

修改后代码:

const product = new Product({ name: "示例商品", price: 99 });
product.save()
  .then(savedDoc => console.log("保存成功", savedDoc))
  .catch(err => console.error("保存失败", err));

2. 改用async/await(更简洁推荐)

将逻辑包裹在async函数中:

async function addProduct() {
  try {
    const product = new Product({ name: "示例商品", price: 99 });
    const savedDoc = await product.save();
    console.log("保存成功", savedDoc);
  } catch (err) {
    console.error("保存失败", err);
  }
}

addProduct();

如果是在Express路由中,直接给路由处理函数加async:

router.post("/products", async (req, res) => {
  try {
    const product = new Product(req.body);
    const savedProduct = await product.save();
    res.status(201).json(savedProduct);
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});

3. 临时降级Mongoose(不推荐)

如果暂时不想修改代码,可以降级到支持回调的Mongoose 5.x版本:

npm install mongoose@5.x --save

二、清理node_modules中未声明的依赖

不需要删除整个node_modules,有两种高效方法:

方法1:使用npm prune命令

直接在项目根目录执行:

npm prune

该命令会自动移除node_modules中所有未在package.json的dependencies、devDependencies里声明的包,同时保留package-lock.json的依赖关系。

如果只想清理生产环境(忽略devDependencies),加--production参数:

npm prune --production

方法2:使用npm ci命令(推荐)

npm ci会严格按照package-lock.json的依赖版本安装,自动清理不符合的包,相当于一键同步依赖:

npm ci

注意:执行前需确保package-lock.json存在,命令会自动删除现有node_modules后重新安装,适合本地同步或CI环境。

内容的提问来源于stack exchange,提问作者dark_litle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:10:17