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