Mongoose:所有保存和更新方法的中间件

Mongoose:所有保存和更新方法的中间件,mongoose,Mongoose,我一直在使用mongoose以下API编写CRUD应用程序: 创建:save() 更新:findByIdAndUpdate() 我希望这两种方法都有一个中间件。我试过pre('save',…)pre('validate',…),但它们只为创建路由激发 是否还有其他东西对这两者都有效,或者我需要重构更新路由以利用save()API?中间件只在save调用上启动,而不在任何更新调用上启动。没有中间件可以触发更新,因为这些更新被直接发送到驱动程序,因此它们是原子的。您可以做的是将您的模型包装到一些

我一直在使用mongoose以下API编写CRUD应用程序:

  • 创建:
    save()
  • 更新:
    findByIdAndUpdate()
我希望这两种方法都有一个中间件。我试过
pre('save',…)
pre('validate',…)
,但它们只为创建路由激发


是否还有其他东西对这两者都有效,或者我需要重构更新路由以利用save()API?

中间件只在
save
调用上启动,而不在任何更新调用上启动。没有中间件可以触发更新,因为这些更新被直接发送到驱动程序,因此它们是原子的。

您可以做的是将您的模型包装到一些扩展
事件的服务中。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('foodated',function(id){…})

如果您需要更新引用或反规范化,那么这种方法非常有效,您可以确保无论您做什么,使用该服务都会触发事件,而Foo不需要知道需要通知多少其他服务