我一直在使用猫鼬以下 API 编写一个 CRUD 应用程序:
- 创造:
save()
- 更新:
findByIdAndUpdate()
我希望这两种方法都有一个中间件。我试过pre('save', ...)
pre('validate', ...)
了,但他们只为创建路线开火。
是否还有其他适用于两者的方法,或者我是否需要重构更新路由以使用 save() API?
我一直在使用猫鼬以下 API 编写一个 CRUD 应用程序:
save()
findByIdAndUpdate()
我希望这两种方法都有一个中间件。我试过pre('save', ...)
pre('validate', ...)
了,但他们只为创建路线开火。
是否还有其他适用于两者的方法,或者我是否需要重构更新路由以使用 save() API?
'save'
中间件仅在调用时触发,而save
不是在任何更新调用时触发。没有为更新触发的中间件,因为这些更新被直接发送给驱动程序,因此它们是原子的。
您可以做的是将您的模型包装在一些扩展的服务中events.EventEmitter
,然后使用该服务对您的模型执行更新,在emit
发生这种情况时让它发生一个事件,然后所有对响应这些更新感兴趣的函数都可以注册到它。
除此之外,目前还没有其他方法可以在数据库调用执行时调用中间件。
作为一个例子,你可以有类似的东西:
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 不需要知道需要通知多少其他服务.