2013-10-24 10 views
17

मुझे डेटाबेस में एक नई वस्तु डालने पर क्लाइंट को संदेशों को उत्सर्जित करने के लिए केवल socket.io की आवश्यकता है। तो मेरा विचार सीधे मेरे नियंत्रक की डालने-विधि से संदेश को उत्सर्जित करना था। मेरी server.js फ़ाइल में iam socket.io वस्तु बनाने और यह अन्य मॉड्यूल के लिए सुलभ बनाने के लिए प्रयास करें:नियंत्रकों में socket.io का उपयोग करें

var server = require('http').createServer(app); 
var io = require('socket.io').listen(server); 

//make socket io accessible for other modules 
module.exports.io = io; 

मेरी नियंत्रक में मैं इस तरह से socket.io उपयोग करके देखें:

var io = require('../server').io; 
... 
io.sockets.on("connection", function(socket){ 
    passportSocketIo.filterSocketsByUser(io, function (user) { 
    return user.workingAt === socket.handshake.user.workingAt; 
    }).forEach(function(s){ 
    s.send("news", insertedObject); 
    }); 
}); 

और यहाँ मैं अटक गया। "कनेक्शन" घटना कभी नहीं निकाल दी जाएगी और इसलिए संदेश उत्सर्जित नहीं किया जाएगा। क्या यह अलग फ़ाइलों में socket.io का उपयोग करने का सही तरीका है? दुर्भाग्य से मैं जटिल socket.io उदाहरण नहीं मिल सकता।

+0

तुम सिर्फ फोन नहीं कर सकते हैं 'io.sockets.emit() ' –

+0

मैं संदेश को सभी उपयोगकर्ता को नहीं भेजना चाहता हूं। इसलिए मुझे सक्रिय सॉकेट को फ़िल्टर करने के लिए सॉकेट ऑब्जेक्ट की आवश्यकता है ... मैंने अपना कोड – tschiela

+1

अपडेट किया है, मैं ऐप को डीबग करने का लुत्फ उठाऊंगा, और सॉकेट बनने और फ़िल्टर किए जाने के बाद क्या होता है, या कुछ लॉगिंग जोड़ने के लिए कुछ लॉगिंग जोड़ें एक ही प्रभाव। चीजें काम कर रहे तरीके के बारे में आपकी धारणाओं में से एक रास्ता दिमागी होगा। मुझे लगता है कि जब कोई HTTP अनुरोध होता है तो आप विशिष्ट सॉकेट को संदेश भेजना चाहते हैं? मुझे लगता है कि आपका दृष्टिकोण काम करना चाहिए, लेकिन व्यक्तिगत रूप से मैं एक ही रैपर मॉड्यूल में सभी सॉकेट.आईओ पहुंच खींचूंगा, और जो मुझे चाहिए, निर्यात करें। 'Mysockets।शुरू करें (बंदरगाह) 'और' mysockets.sendNews (उपयोगकर्ता, msg) ' –

उत्तर

42

आप नियंत्रण के प्रवाह को उलटने की कोशिश कर रहे हैं। ऐसा करने का तरीका आपके नियंत्रक के लिए एक इंटरफ़ेस (एपीआई) लागू करना है जो आपका सर्वर नियंत्रण पास करने के लिए उपयोग कर सकता है।

एक साधारण उदाहरण होगा:

mycontroller.js में

// no require needed here, at least, I don't think so 

// Controller agrees to implement the function called "respond" 
module.exports.respond = function(socket_io){ 
    // this function expects a socket_io connection as argument 

    // now we can do whatever we want: 
    socket_io.on('news',function(newsreel){ 

     // as is proper, protocol logic like 
     // this belongs in a controller: 

     socket.broadcast.emit(newsreel); 
    }); 
} 
अब

server.js में: क्योंकि नियंत्रक एपीआई वास्तव में एक socket.io कॉलबैक की तरह लग रहा

var io = require('socket.io').listen(80); 
var controller = require('./mycontroller'); 

io.sockets.on('connection', controller.respond); 

यह उदाहरण सरल है । लेकिन क्या होगा यदि आप नियंत्रक को अन्य पैरामीटर पास करना चाहते हैं? io ऑब्जेक्ट की तरह या अंत बिंदुओं का प्रतिनिधित्व करने वाले चर की तरह? इसके लिए आपको थोड़ा और काम चाहिए लेकिन यह ज्यादा नहीं है। यह मूल रूप से एक ही चाल हम अक्सर से बाहर तोड़ या बंद होने बनाने के लिए उपयोग है: समारोह जनरेटर:

mycontroller.js

module.exports.respond = function(endpoint,socket){ 
    // this function now expects an endpoint as argument 

    socket.on('news',function(newsreel){ 

     // as is proper, protocol logic like 
     // this belongs in a controller: 

     endpoint.emit(newsreel); // broadcast news to everyone subscribing 
            // to our endpoint/namespace 
    }); 
} 

अब में सर्वर पर हम क्रम में अंत पारित करने के लिए थोड़ा और काम आवश्यकता होगी बिंदु:

var io = require('socket.io').listen(80); 
var controller = require('./mycontroller'); 

var chat = io 
    .of('/chat') 
    .on('connection', function (socket) { 
     controller.respond(chat,socket); 
    }); 

सूचना है कि हम socket सीधे के माध्यम से पारित लेकिन हम एक बंद के माध्यम से chat पर कब्जा। इस के साथ आप अपने स्वयं के नियंत्रकों के साथ कई अंतिमबिंदुओं प्रत्येक हो सकता है:

var io = require('socket.io').listen(80); 
var news_controller = require('./controllers/news'); 
var chat_controller = require('./controllers/chat'); 

var news = io 
    .of('/news') 
    .on('connection', function (socket) { 
     news_controller.respond(news,socket); 
    }); 

var chat = io 
    .of('/chat') 
    .on('connection', function (socket) { 
     chat_controller.respond(chat,socket); 
    }); 

असल में, आप भी एक endpoint के लिए एकाधिक नियंत्रकों का उपयोग कर सकते हैं। याद रखें, नियंत्रक घटनाओं की सदस्यता लेने के अलावा कुछ भी नहीं करते हैं।

var io = require('socket.io').listen(80); 
var news_controller = require('./controllers/news'); 
var chat_controller = require('./controllers/chat'); 

var chat = io 
    .of('/chat') 
    .on('connection', function (socket) { 
     news_controller.respond(chat,socket); 
     chat_controller.respond(chat,socket); 
    }); 

यह भी सादे socket.io साथ काम करता है (कोई अंतिम बिंदु/नामस्थान):: यह सर्वर है कि सुन कर रहा है है

var io = require('socket.io').listen(80); 
var news_controller = require('./controllers/news'); 
var chat_controller = require('./controllers/chat'); 

io.sockets.on('connection', function (socket) { 
    news_controller.respond(socket); 
    chat_controller.respond(socket); 
}); 
+0

आपके लिए बहुत बढ़िया उत्तर धन्यवाद, जो बहुत ही आगे की ओर दिखता है। लेकिन मेरे पास एक सवाल है: क्या होगा अगर मैं एक से अधिक नियंत्रक में socket.io का उपयोग करना चाहता हूं? – tschiela

+1

यह दूसरे भाग में शामिल है - प्रत्येक नियंत्रक के लिए अलग-अलग अंतराल का उपयोग करें। – slebetman

+0

धन्यवाद, greate उत्तर – tschiela

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