如何在猫鼬中间件中发出事件?
How to emit event in mongoose middleware?
我想在新博客保存时发出事件
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);
})
怎么做?
事件发射器的工作方式是您必须使用相同的 事件发射器对象来监听您过去发射的对象。所以你需要这样的东西:
要在项目的不同部分之间共享它,您应该从中创建一个模块并在需要的地方使用它。
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);
虽然公平 警告:您正在污染全局范围 。如果其他一些模块也在做同样的事情并使用相同的事件名称,那么您就会遇到冲突,这种冲突可能会以意想不到的方式出现并且更难调试。
如果您从文档(特定架构的实例)发出事件,那么您必须侦听此实例以接收事件。
如果您想全局监听所有实例生成的所有事件,那么您必须从架构中发出事件。
blog.post('save',function(blog){
blog.schema.emit('newBlog',blog)
})
例如,在您的 app.js 中,您可以监听架构上的事件:
Blog.schema.on('newBlog',function(blog){
console.log(blog);
})
我想在新博客保存时发出事件
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);
})
怎么做?
事件发射器的工作方式是您必须使用相同的 事件发射器对象来监听您过去发射的对象。所以你需要这样的东西:
要在项目的不同部分之间共享它,您应该从中创建一个模块并在需要的地方使用它。
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);
虽然公平 警告:您正在污染全局范围 。如果其他一些模块也在做同样的事情并使用相同的事件名称,那么您就会遇到冲突,这种冲突可能会以意想不到的方式出现并且更难调试。
如果您从文档(特定架构的实例)发出事件,那么您必须侦听此实例以接收事件。
如果您想全局监听所有实例生成的所有事件,那么您必须从架构中发出事件。
blog.post('save',function(blog){
blog.schema.emit('newBlog',blog)
})
例如,在您的 app.js 中,您可以监听架构上的事件:
Blog.schema.on('newBlog',function(blog){
console.log(blog);
})