如何发布mongoose中间件事件?

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

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); }) 

这个怎么做?

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

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

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); 

如果您不想经历创build和需要您自己的模块的麻烦,您可以使用也是EventEmitter的全局process

anywhere:

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

anywhere-else:

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

尽pipe公正的警告:你正在污染全球范围 。 如果其他一些模块也是这样做的,并使用相同的事件名称,则可能会出现意想不到的冲突,甚至更难debugging。

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

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

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

例如,在你的app.js中,你可以监听模式上的事件:

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