2015-06-01 4 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); 
}); 

0 उपयोग करना चाहते हैं

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 से नेवला स्कीमा इनहेरिट, तो (:

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

और उदाहरण के लिए अपने app.js में, आप स्कीमा पर घटनाओं के लिए सुन सकते हैं newBlog ', ब्लॉग) 'eventEmitter.emit (' newBlog ', ब्लॉग) के बजाय' ', लेकिन घटना श्रोता काम नहीं करेगा।और मुझे लगता है कि अगर मुझे इसका उपयोग करने की ज़रूरत है तो मुझे एक ही घटना उत्सर्जक पारित करना होगा, तो बिंदु क्या है? मुझे परेशानी का एक गुच्छा बचाने के लिए बस वास्तविक व्यापार तर्क के साथ घटना को प्रतिस्थापित कर सकते हैं। – paynestrike

+1

@paynestrike बिंदु decoupling है। इसका मतलब है कि जो चीज उत्सर्जित हो रही है उसे सुनने वाली सभी चीजों के बारे में पता नहीं होना चाहिए। –

+0

@AaronDufour तो मैं app.js पर अपने मॉडल में eventEmitter कैसे पास कर सकता हूं? – paynestrike

2

यदि आप किसी दस्तावेज़ (एक विशिष्ट स्कीमा का एक उदाहरण) से अपना ईवेंट उत्सर्जित करते हैं, तो आपको ईवेंट प्राप्त करने के लिए इस उदाहरण को सुनना होगा।

यदि आप सभी उदाहरणों से उत्पन्न सभी घटनाओं पर विश्व स्तर पर सुनना चाहते हैं तो आपको स्कीमा से ईवेंट को उत्सर्जित करना होगा। 'मैं सिर्फ `this.emit कर सकते हैं

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

आप अपने विधि का प्रयास किया – paynestrike

+0

क्षमा करें, मैं पद हुक्स के साथ परीक्षण नहीं किया था, लेकिन मैं यह काम करता है अगर आप दस्तावेज़ का एक उदाहरण है पता है। तो आप blog.schema द्वारा इस.schema को प्रतिस्थापित कर सकते हैं। यह –

+0

@paynestrike काम करना चाहिए, क्या आप अधिसूचना कार्य करने में सफल रहे? –

संबंधित मुद्दे