如何在猫鼬中间件中发出事件?

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