如何在mongoose中间件中发出事件?

时间:2015-06-01 09:22:59

标签: node.js events mongoose emit

我想在新博客保存时发出活动

blog.post('save',function(blog){
    this.emit('newBlog',blog)
})

在我的项目的其他地方说app.js可以听这个事件

EventEmitter  = require('events').EventEmitter;
emitter = new EventEmitter();

emitter.on('newBlog',function(blog){
    console.log(blog);
})

怎么做?

2 个答案:

答案 0 :(得分:9)

事件发射器的工作方式是您必须使用相同的事件发射器对象来侦听您曾经发射的事件。所以你需要这样的东西:

要在项目的不同部分之间共享,您应该从中创建一个模块,并在需要的地方使用它。

<强> my-event.js:

var eventEmitter = new require('events').EventEmitter();
module.exports = eventEmitter; 

然后你require eventEmitter想要使用它

<强> blog.js:

var myEvent = require('../my-event');
blog.post('save',function(blog){
    myEvent.emit('newBlog', blog);
});

<强> app.js:

var myEvent = require('./my-event');
myEvent.on('newBlog', console.log);

如果您不想遇到创建和需要自己的模块的麻烦,可以使用全局process,它也是一个EventEmitter。

<强> anywhere:

process.on('my-custom-event', myCustomHandler);

<强> anywhere-else:

process.emit('my-custom-event', data);

虽然公平警告:您正在污染全球范围。如果某些其他模块也在使用相同的事件名称,那么您就会发生冲突,这种冲突可能以意想不到的方式出现,甚至更难调试。

答案 1 :(得分:4)

如果从文档(特定模式的实例)发出事件,则必须侦听此实例以接收事件。

如果要全局侦听所有实例生成的所有事件,则必须从Schema中发出事件。

blog.post('save',function(blog){
    blog.schema.emit('newBlog',blog)
})

例如,在您的app.js中,您可以侦听架构上的事件:

Blog.schema.on('newBlog',function(blog){
    console.log(blog);
})