如何发布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); })