2

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

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

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

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

4

2 回答 2

6

'save'中间件仅在调用时触发,而save不是在任何更新调用时触发。没有为更新触发的中间件,因为这些更新被直接发送给驱动程序,因此它们是原子的。

于 2013-02-22T14:16:55.803 回答
0

您可以做的是将您的模型包装在一些扩展的服务中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 不需要知道需要通知多少其他服务.

于 2014-03-09T21:06:51.633 回答