Mongoose pre/post中间件未触发:model.save调用时无响应
Mongoose pre/post save中间件未触发的排查与解决
核心问题:post中间件参数错误
你的post('save')中间件写法存在错误,这是导致中间件不触发的最可能原因:
post save中间件的第一个参数是保存完成后的文档,没有next参数,传入next会导致Mongoose无法正确执行该中间件,甚至静默失败。
错误代码:
schema.post('save', function(next) { console.log('post save') next() })
正确写法:
schema.post('save', function(doc) { console.log('post save', doc._id) })
其他排查方向
- 确认中间件挂载顺序:确保所有
pre/post中间件都在调用mongoose.model('MySchema', schema)之前挂载到Schema上,你的代码顺序是正确的,但要排查是否有其他地方重新定义了该Model覆盖了当前Schema。 - 验证save操作是否正常执行:在save的Promise链中添加错误捕获,确认保存是否成功(保存失败时中间件不会触发):
model.save().then((doc) => { console.log('文档保存成功:', doc) res.sendStatus(201) }).catch(err => { console.error('保存失败:', err) res.sendStatus(500) }) - 检查是否使用了绕过save的操作:比如
updateOne()、findByIdAndUpdate()等方法不会触发save中间件,你的代码使用new MySchema().save()是正确的,但要确认业务逻辑中没有替换成其他操作。 - 确认数据库连接状态:如果Mongoose未成功连接数据库,save操作会处于pending状态,中间件也不会执行,可以添加数据库连接日志验证:
mongoose.connection.on('connected', () => { console.log('数据库连接成功') })
内容的提问来源于stack exchange,提问作者user6819710
相关产品推荐
相关产品推荐

