求助: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
相关产品推荐
相关产品推荐

