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

pay*_*ike 11 events mongoose node.js emit

我想在新博客保存时发出事件

blog.post('save',function(blog){
    this.emit('newBlog',blog)
})
Run Code Online (Sandbox Code Playgroud)

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

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

emitter.on('newBlog',function(blog){
    console.log(blog);
})
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

lag*_*lex 9

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

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

my-event.js:

var eventEmitter = new require('events').EventEmitter();
module.exports = eventEmitter; 
Run Code Online (Sandbox Code Playgroud)

然后,你require这个eventEmitter地方,你想用它

blog.js:

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

app.js:

var myEvent = require('./my-event');
myEvent.on('newBlog', console.log);
Run Code Online (Sandbox Code Playgroud)

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

anywhere:

process.on('my-custom-event', myCustomHandler);
Run Code Online (Sandbox Code Playgroud)

anywhere-else:

process.emit('my-custom-event', data);
Run Code Online (Sandbox Code Playgroud)

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