2015-03-26 4 views
9

मैं socket.io (1.3.5) के साथ एक सरल Node.js एप्लिकेशन है, socket.io उदाहरण से लिया:Socket.io ग्राहक बंदरगाह अनदेखी जब नाम स्थान में इस्तेमाल किया [बग?]

// Setup basic express server 
var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app); 
var io = require('socket.io')(server); 
var port = process.env.PORT || 3000; 

server.listen(port, function() { 
    console.log('Server listening at port %d', port); 
}); 

// Routing 
app.use(express.static(__dirname + '/public')); 

io.of('/admin').on('connection', function(socket){ 
    //handle conection on /admin namespace 
}); 

io.of('/user').on('connection', function(socket){ 
    //handle conection on /user namespace 
}); 

अब में मेरे सामने के अंत मैं तो जैसे इन विशिष्ट नामस्थान से कनेक्ट (फिर से, उदाहरण से लिया गया):

var admin_socket = io('/admin'); 
var user_socket = io('/user'); 

एप्लिकेशन पोर्ट 3000 पर चल रहा है और वेबसाइट यूआरएल localhost:3000 का उपयोग कर खोला जाता है।
जब कर रही है कि मैं CORS त्रुटियों हो रही है, यह ग्राहक के पक्ष Socket.io की तरह लगता है ऑटो का पता लगाने के रूप में जल्द ही मैं नामस्थान का उपयोग शुरू कर के रूप में पोर्ट संख्या नहीं है (फ़ायरफ़ॉक्स देव उपकरण में मैं अनुरोध localhost:3000/ बजाय localhost/ के लिए जा रहा देख सकते हैं)।


नामस्थान मेरे सर्वर साइड पर मैं उपयोग नहीं करते हैं:

var socket = io(); 

सब कुछ काम करता है ठीक, बंदरगाह ऑटो:

io.on('connection', function(socket){ 
    //handle general conection 
}); 

और सामने के अंत पर मैं इस तरह से कनेक्ट -डिस्वरी काम करता है और फ़ायरफ़ॉक्स देव उपकरण में मैं localhost:3000/ पर कनेक्शन देख सकता हूं।


वैकल्पिक रूप से, अगर मैं अभी भी अपने बैक-एंड पर नामस्थान उपयोग करें, और सामने के छोर पर मैं बहुत तरह कनेक्ट:

var admin_socket = io('localhost:3000/admin'); 
var user_socket = io(':3000/user'); //I can skip localhost 

फिर सब कुछ काम करता है (और वास्तव में फ़ायरफ़ॉक्स देव उपकरण में मैं नेटवर्क देख सकते हैं अनुरोध localhost:3000/ पर जा रहे हैं)।


पोर्ट ऑटो-डिस्कवरी नामस्थानों के साथ कैसे काम नहीं कर रही है? क्या इसे काम करने का कोई तरीका है? क्या मुझसे कोई चूक हो रही है? धन्यवाद।


मेरा उत्तर पोर्ट के साथ गड़बड़ करने के लिए

+1

इस बग वास्तव में कष्टप्रद था, socket.io के किसी भी पुराने संस्करणों में वहाँ नहीं था। फिक्स के लिए धन्यवाद! – Evers

+1

1.3.6 में बग अभी भी मौजूदा है, जहां यह मेरे समय का एक दिन खाया। फिक्स के साथ इस लेखन के लिए बहुत धन्यवाद - मैं डिफ़ॉल्ट नामस्थान में काम करने की खोज पर रुका था। – willw

+0

क्या आप अपना * उत्तर * * प्रश्न * से बाहर * एक * उत्तर * में ले जा सकते हैं? – phihag

उत्तर

0

ठीक है तो मैं socket.io.js में कोड के कुछ डिबगिंग किया और महसूस किया कि वहां एक संभावित बग है। लाइन 1050 पर loc.hostname के बजाय loc.hostname का उपयोग किया जाता है। नामस्थान में गुजरते समय यह होस्टनाम का उपयोग करने का कारण बनता है, इसमें पोर्ट नंबर शामिल नहीं है।
कोई नामस्थान उपयोग नहीं होने पर, लाइन 1024 loc.host पर उपयोग किया जा रहा है और सब कुछ ठीक है।
मैंने फ़ाइल की एक प्रति ली है और मेजबान का उपयोग करने के लिए लाइन 1050 बदल दी है और सब कुछ ठीक काम करता है।
उस के साथ मिले GitHub मुद्दा है, यह 1.4.x में तय हो गई है: https://github.com/Automattic/socket.io-client/issues/812

0

कोई ज़रूरत नहीं एक फिक्स के लिए नीचे देखें ..., यह काफी बस द्वारा

var admin_socket = io('/admin'); 
var user_socket = io('/user'); 
0

काम करना चाहिए मुझे नहीं लगता कि किसी भी करते हैं वास्तविक Socket.io कोड को संशोधित किए बिना या फ़िक्स के लिए प्रतीक्षा किए बिना ऑटो पोर्ट खोज को काम करने का तरीका। सबसे सरल चीज जो आप कर सकते हैं वह सिर्फ location.port को अपने नामस्थान से पहले एक कोलन समेत डालें।

var admin_socket = io(':' + location.port + '/admin'); 
var user_socket = io(':' + location.port + '/user'); 

या एक नया फ़ंक्शन बनाएं जो आपके लिए सॉकेट बनाएगा।

function sio(nsp) { 
    return io(':' + location.port + nsp); 
} 
संबंधित मुद्दे