我一直在使用以下API的mongoose编写CRUD应用程序:
save()
findByIdAndUpdate()
我希望这两种方法都有中间件。我已经尝试pre('save', ...)
pre('validate', ...)
,但他们只为创建路线开火。
是否还有其他适合两者的内容,或者我是否需要重构更新路由以使用save()API?
答案 0 :(得分:6)
'save'
中间件仅在save
次呼叫时触发,而不在任何更新呼叫上触发。没有任何中间件会触发更新,因为这些中间件会被发送到驱动程序,因此它们是原子的。
答案 1 :(得分:0)
你可以做的是将你的模型包装在一些扩展events.EventEmitter
的服务中,然后使用该服务对你的模型进行更新,让emit
事件发生,然后发生所有感兴趣的函数在回复这些更新时,只需注册即可。
除此之外,目前还没有其他方法可以在数据库调用execute时调用中间件。
作为一个例子,你可以有类似的东西:
function FooService() {
var self = this
var Foo = require('./path/to/foo/module')
this.edit = function(id, changes) {
Foo.findByIdAndUpdate(id, changes, function(err) {
if (!err) {
self.emit('FooUpdated', id)
}
})
}
}
util.inherits(FooService, events.EventEmitter)
module.exports = new FooService()
这样一来,如果有人有兴趣知道foo
何时更新,他们可以只需要服务并执行:FooService.on('FooUpdated', function(id){...})
如果您需要更新引用或非规范化,这可以很好地工作,无论您做什么,您都可以确保使用该服务,您总是会触发事件并且Foo不需要知道有多少其他服务需要收到通知。