2015-06-01 11 views
10

Ich möchte Ereignis auszusenden, wenn neue BlogWie man Ereignis in mongoose Middleware ausstrahlt?

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

und woanders in meinem Projekt sagen app.js dieses Ereignis hören

EventEmitter = require('events').EventEmitter; 
emitter = new EventEmitter(); 

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

, wie dies zu tun?

Antwort

9

Die Art und Weise, wie der Ereignis-Emitter funktioniert, ist, dass Sie das selbe Ereignis-Emitter-Objekt verwenden müssen, um auf das zu hören, das Sie emittiert haben. Sie benötigen also etwas wie dieses:

Um dies unter den verschiedenen Teilen Ihres Projekts zu teilen, sollten Sie ein Modul daraus erstellen und es wo immer nötig benötigen.

my-event.js:

var eventEmitter = new require('events').EventEmitter(); 
module.exports = eventEmitter; 

Dann Sie require diese eventEmitter wo Sie es

blog.js:

var myEvent = require('../my-event'); 
blog.post('save',function(blog){ 
    myEvent.emit('newBlog', blog); 
}); 

0 verwenden möchten

var myEvent = require('./my-event'); 
myEvent.on('newBlog', console.log); 

Wenn Sie Ihr eigenes Modul nicht gehen wollen, sich die Mühe zu schaffen und erfordern, können Sie die globale process verwendet werden, die auch ein EventEmitter ist.

anywhere:

process.on('my-custom-event', myCustomHandler); 

anywhere-else:

process.emit('my-custom-event', data); 

Obwohl eine faire Warnung: Sie die globale Reichweite sind umweltfreundlich. Wenn ein anderes Modul dasselbe tut und dieselben Ereignisnamen verwendet, dann haben Sie einen Konflikt, der auf unerwartete Weise auftreten kann und noch schwieriger zu debuggen ist.

+0

denke ich Mungo Schema vererben EventEmitter, also kann ich 'this.emit gerade tun (‘ newBlog ', blog) 'statt' eventEmitter.emit (' newBlog ', blog); ', aber der Event-Listener funktioniert nicht.und ich denke, wenn ich den gleichen Ereignisemitter immer dann passieren muss, wenn ich es benutzen muss, was ist der Punkt? Ich kann das Ereignis einfach durch die tatsächliche Geschäftslogik ersetzen, um mir eine Menge Ärger zu ersparen. – paynestrike

+1

@paynestrike Der Punkt ist die Entkopplung. Es bedeutet, dass das, was emittiert, nicht über all die Dinge, die zuhören, Bescheid wissen muss. –

+0

@AaronDufour dann, wie kann ich eventEmitter in meinem Modell zu app.js übergeben? – paynestrike

2

Wenn Sie Ihr Ereignis aus einem Dokument (einer Instanz eines bestimmten Schemas) ausgeben, müssen Sie auf diese Instanz warten, um das Ereignis zu empfangen.

Wenn Sie alle von allen Instanzen generierten Ereignisse global überwachen möchten, müssen Sie das Ereignis über das Schema ausgeben.

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

Und in Ihrem app.js zum Beispiel, können Sie für Veranstaltungen auf dem Schema hören:

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

Haben Sie Ihre Methode versucht, ich tat und es funktioniert nicht.this.schema ist undefined. – paynestrike

+0

Entschuldigung, ich habe nicht mit den Post-Hooks getestet, aber ich weiß, dass es funktioniert, wenn Sie eine Instanz eines Dokuments haben. Sie können also this.schema durch blog.schema ersetzen. Es sollte funktionieren –

+0

@paynestrike, hast du es geschafft, die Benachrichtigung funktioniert? –

Verwandte Themen