2015-06-01 14 views
10

我想發出事件時,新的博客保存如何在貓鼬中間件中發送事件?

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

如何做到這一點?

回答

9

事件發射器的工作方式是,您必須使用相同的事件發射器對象來偵聽您用來發射的事件。所以你需要這樣的東西:

要在你的項目的不同部分之間分享,你應該創建一個模塊,並在需要的時候需要它。

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

雖然公平警告:你正在污染全球範圍。如果某個其他模塊也在執行相同的事件並使用相同的事件名稱,則可能會出現意外情況並且更難以調試的衝突。

+0

我覺得從EventEmitter貓鼬架構繼承,這樣我就可以做'this.emit(」 newBlog',blog)'而不是'eventEmitter.emit('newBlog',blog);',但事件監聽器不起作用。我想如果我需要使用它時必須通過相同的事件發射器,那麼有什麼意義呢?我可以用事實上的業務邏輯來替換事件,以節省一些麻煩。 – paynestrike

+1

@paynestrike關鍵是解耦。這意味着發出的東西不必知道所有正在聽的東西。 –

+0

@AaronDufour那麼我怎樣才能將我的模型中的eventEmitter傳遞給app.js? – paynestrike

2

如果您從文檔(特定模式的實例)發出您的事件,那麼您必須監聽此實例以接收事件。

如果要全局監聽由所有實例生成的所有事件,則必須從架構中發出事件。

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

而在你的app.js例如,您可以監聽模式上的事件:

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

您是否嘗試過您的方法,我做過,沒有工作.'this.schema'未定義。 – paynestrike

+0

對不起,我沒有測試post hook,但我知道它有效,如果你有一個文檔的實例。所以你可以用blog.schema替換this.schema。它應該工作 –

+0

@paynestrike,你成功地通知工作? –