2016-05-15 5 views
5

मैं वर्तमान में क्लाइंट-साइड जावास्क्रिप्ट फ़ाइल और एक नोड.जेएस सर्वर फ़ाइल के बीच घटनाओं को उत्सर्जित करने और सुनने के लिए socket.io का उपयोग कर रहा हूं, लेकिन मैं नोड सर्वर और उसके मॉड्यूल के बीच ईवेंट को उत्सर्जित और सुनना चाहता हूं । मेरे बारे में सोचा है कि यह कुछ इस तरह दिखाई देगी:मैं Node.js के साथ जावास्क्रिप्ट मॉड्यूल फ़ाइलों के बीच इवेंट हैंडलर का उपयोग कैसे करूं?

नोड सर्वर:

var module1 = require('./module1'); 

//Some code to launch and run the server 

module1.emit('eventToModule'); 
module1.emit('moduleResponse', function(moduleVariable) { 
    //server action based on module response 
} 

मॉड्यूल फ़ाइल:

var server = require('./server.js'); 

server.on('eventToModule', function() { 
    //module response to server request 
} 
server.emit('moduleResponse', moduleVariable); 

यह स्पष्ट रूप से एक सरलीकृत संस्करण है, लेकिन मुझे लगता है कि होता है कि इस कार्यशीलता होना चाहिए उपलब्ध। क्या मुझे मॉड्यूल फ़ाइल को दूसरे सर्वर के रूप में स्थापित करने की आवश्यकता है? यदि हां, तो यह कैसा दिखता है?

मैं भी server की var socket = io.connect('http://localhost:3000'); उपयोग करने की कोशिश (इस कोड मैं ग्राहक नोड सर्वर से कनेक्ट करने की अनुमति के लिए इस्तेमाल करते हैं) के बजाय और था module1 पर सुनने और socket को फेंकना लेकिन है कि या तो काम नहीं किया।

दूसरा प्रयास (अभी भी काम नहीं):

server.js

//other requirements 
var module1 = require('./module'); 
const EventEmitter = require('events'); 
var emitter = new EventEmitter(); 

io.on('connection', function(client) { 
    client.on('emitterTester', function() { 
     emitter.emit('toModule'); 
     emitter.on('toServer', function() { 
     console.log("Emitter successful."); 
     }); 
    }); 
}); 

module.exports = emitter; 

module.js

var server1 = require('./server'); 
const EventEmitter = require('events'); 
var emitter = new EventEmitter(); 

emitter.on('toModule', function() { 
    console.log("Emitter heard by module."); 
    emitter.emit('toServer');   
}); 

module.exports = emitter; 

इसके अलावा, जब मैं server1.on इस्तेमाल करने की कोशिश, मैं संदेश मिलता है server1.on is not a function

उत्तर

15

node.js में, EventEmitter object आमतौर पर आप जो ऑब्जेक्ट बनाना चाहते हैं, उस ईवेंट को बनाना चाहते हैं जिसमें ईवेंट श्रोताओं हैं और फिर ईवेंट ट्रिगर कर सकते हैं। आप या तो सीधे EventEmitter ऑब्जेक्ट का उपयोग कर सकते हैं या आप इससे प्राप्त कर सकते हैं और अपनी खुद की ऑब्जेक्ट बना सकते हैं जिसमें सभी EventEmitter कार्यक्षमता है।

इसलिए, यदि आप एक मॉड्यूल है कि अन्य मॉड्यूल पर घटनाओं को सुन सके और बनाना चाहता था, आप कुछ इस तरह करना होगा: फिर

// module1.js 
// module that has events 

// create EventEmitter object 
var obj = new EventEmitter(); 

// export the EventEmitter object so others can use it 
module.exports = obj; 

// other code in the module that does something to trigger events 
// this is just one example using a timer 
setInterval(function() { 
    obj.emit("someEvent", someData); 
}, 10 * 1000); 

, तो आप एक मॉड्यूल का उपयोग करता है पहले एक और सुनता है कि हो सकता है कुछ घटनाओं के लिए यह से आ रही:

// module2.js 
var m1 = require('module1.js'); 

// register event listener 
m1.on("someEvent", function(data) { 
    // process data when someEvent occurs 
}); 

महत्वपूर्ण बिंदुओं यहां हैं:

  1. आप पानी तो एनटी मॉड्यूल लोगों को घटनाओं को सुनने और फिर घटनाओं को ट्रिगर करने की अनुमति देने के लिए, शायद आप EventEmitter ऑब्जेक्ट बनाना चाहते हैं।
  2. साझा करने के लिए कि EventEmitter वस्तु, आप इसे module.exports को असाइन या module.exports ताकि अन्य कोड है कि अपने मॉड्यूल की एक require() करता EventEmitter वस्तु का उपयोग प्राप्त कर सकते हैं की एक संपत्ति।
  3. एक बार कॉलिंग कोड require() से ऑब्जेक्ट प्राप्त करने के बाद, यह .on() विधि के साथ ईवेंट सुनने के लिए पंजीकरण कर सकता है।
  4. जब मूल मॉड्यूल या कोई मॉड्यूल किसी ईवेंट को ट्रिगर करना चाहता है, तो यह .emit() विधि के साथ ऐसा कर सकता है।

ध्यान रखें कि कभी कभी घटनाओं के लिए एक महान वास्तु विकल्प होते हैं, लेकिन नहीं मॉड्यूल के बीच सभी संचार सबसे अच्छा घटनाओं के लिए अनुकूल है। कभी-कभी, यह केवल कार्यों को निर्यात करने और एक मॉड्यूल को अन्य मॉड्यूल के कार्यों को कॉल करने की अनुमति देता है। इसलिए, घटनाएं एकमात्र तरीका नहीं है कि मॉड्यूल एक दूसरे के साथ संवाद कर सकते हैं।


आपका प्रश्न इंगित करने के लिए आप एक ही सर्वर प्रक्रिया से संवाद करने में दो मॉड्यूल के लिए एक मार्ग के रूप socket.io का लगता है कि लगता है। हालांकि ऐसा करना संभव हो सकता है, यह आमतौर पर सॉकेट.ओ का उपयोग नहीं किया जाएगा। आमतौर पर socket.io (जो टीसीपी/आईपी आधारित है) का उपयोग दो अलग-अलग प्रक्रियाओं के बीच संचार के लिए किया जाएगा, जहां आपके पास प्रत्यक्ष प्रक्रिया कॉल करने की लक्जरी नहीं है या आपकी प्रक्रिया में किसी ईवेंट के लिए हैंडलर पंजीकृत नहीं है। ये बाद की दो योजनाएं आमतौर पर एक प्रक्रिया के भीतर संचार के लिए बहुत आसान होती हैं, जबकि socket.io आमतौर पर एक ही कंप्यूटर पर या विभिन्न कंप्यूटरों पर प्रक्रियाओं के बीच संचार के लिए संचार के लिए उपयोग किया जाता है।

+0

प्रतिक्रिया के लिए धन्यवाद, लेकिन यह अभी भी मेरे लिए काम नहीं कर रहा है। मैंने दूसरी पोस्ट को दिखाने के लिए मूल पोस्ट संपादित किया। वैसे, मुझे पता है कि मैं इसे विधियों को आयात करके और सर्वर फ़ाइल में उनका उपयोग करके इसे सेट कर सकता हूं। मैं सर्वर फ़ाइल के थोक पर कटौती करने के लिए घटनाओं के माध्यम से ऐसा करना पसंद करता हूं। धन्यवाद। – SuperCodeBrah

+0

@SuperCodeBrah - आप पर्याप्त कोड नहीं दिखाते हैं (हमें server.js में 'module.exports' को देखने की आवश्यकता है), लेकिन ऐसा लगता है कि आप server.js से EventEmitter निर्यात नहीं कर रहे हैं और फिर उस विशेष घटना का उपयोग कर मॉड्यूल में उदाहरण उदाहरण .js। कृपया देखें कि मेरा कोड उदाहरण कैसा है। – jfriend00

+0

हाँ, मुझे पहले संपादन में याद आया। यह अभी होना चाहिए। साथ ही, घटनाएं सर्वर और मॉड्यूल के बीच दोनों दिशाओं में जा रही हैं, इसलिए मुझे लगता है कि जो भी मेरे पास मॉड्यूल में है, मुझे सर्वर में और इसके विपरीत की आवश्यकता होगी। – SuperCodeBrah

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