2013-02-22 91 views
2

我已经写了一个CRUD应用程序:猫鼬:中间件使用猫鼬以下API的所有保存和更新方法

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

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

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

回答

5

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

0

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