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

时间:2013-02-22 09:33:34

标签: mongoose

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

  • 创建:save()
  • 更新:findByIdAndUpdate()

我希望这两种方法都有中间件。我已经尝试pre('save', ...) pre('validate', ...),但他们只为创建路线开火。

是否还有其他适合两者的内容,或者我是否需要重构更新路由以使用save()API?

2 个答案:

答案 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不需要知道有多少其他服务需要收到通知。