【问题标题】:How to emit event in mongoose middleware?如何在猫鼬中间件中发出事件?
【发布时间】:2015-06-01 09:22:58
【问题描述】:

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

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

如何做到这一点?

【问题讨论】:

    标签: node.js events mongoose emit


    【解决方案1】:

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

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

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

    虽然是一个公平的警告:您正在污染全球范围。如果其他一些模块也在做同样的事情并使用相同的事件名称,那么你就有可能以意想不到的方式出现并且更难调试的冲突。

    【讨论】:

    • 我认为 mongoose 模式继承自 EventEmitter,所以我可以只做 this.emit('newBlog',blog) 而不是 eventEmitter.emit('newBlog',blog);,但事件监听器不起作用。我想如果我必须在需要使用它的时候传递同一个事件发射器,那有什么意义呢?我可以用实际的业务逻辑替换事件来省去很多麻烦。
    • @paynestrike 关键是脱钩。这意味着发出的东西不必知道所有正在收听的东西。
    • @AaronDufour 那么如何将模型中的 eventEmitter 传递给 app.js?
    • @paynestrike 您必须从模型文件中导出它并从 app.js 中要求它。
    【解决方案2】:

    如果您从文档(特定 Schema 的实例)发出事件,则必须侦听此实例才能接收事件。

    如果您想全局监听所有实例生成的所有事件,那么您必须从 Schema 发出事件。

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

    例如,在您的 app.js 中,您可以侦听架构上的事件:

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

    【讨论】:

    • 你试过你的方法了吗,我试过了,但它不起作用。this.schema 未定义。
    • 抱歉,我没有使用 post 挂钩进行测试,但我知道如果您有文档实例,它可以工作。所以你可以用 blog.schema 替换 this.schema。它应该工作
    • @paynestrike,您是否成功完成了通知工作?
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2020-08-11
    • 2015-05-14
    相关资源
    最近更新 更多