2015-03-26 15 views
9

ho una semplice applicazione con node.js socket.io (1.3.5), tratto da esempi socket.io:Socket.io cliente ignorando porta quando namespace utilizzato [Bug?]

// 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 
}); 

Ora, in il mio front-end mi collego a questi spazi dei nomi specifici in questo modo (ancora una volta, preso dal esempio):

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

l'applicazione è in esecuzione sulla porta 3000 e il sito viene aperto utilizzando URL localhost:3000.
Quando faccio ciò ottengo errori CORS, sembra che Socket.io sul lato client non rilevi automaticamente il numero di porta non appena inizio a usare gli spazi dei nomi (negli strumenti dev di firefox posso vedere richieste che vanno a localhost/ anziché a localhost:3000/).


Se sul mio lato server Non faccio uso di namespace:

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

E sul front-end che si collegano in questo modo:

var socket = io(); 

Tutto funziona bene, automatico porto -discovery funziona e negli strumenti dev firefox posso vedere le connessioni effettuate a localhost:3000/.


In alternativa, se ho ancora utilizzare gli spazi dei nomi sulla mia back-end, e il front-end si collega in questo modo:

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

Anche in questo caso tutto funziona (e anzi in strumenti di sviluppo di Firefox che posso vedere di rete richieste che vanno a localhost:3000/).


Come mai la ricerca automatica della porta non funziona con gli spazi dei nomi? C'è un modo per farlo funzionare? Mi sto perdendo qualcosa qui? Grazie.


Vedere la mia risposta qui sotto per una correzione ...

+1

Questo problema è stato davvero fastidioso, non c'era in tutte le versioni precedenti di socket.io. Grazie per la correzione! – Evers

+1

Bug ancora esistente in 1.3.6, dove ha consumato un giorno del mio tempo. Mille grazie per questo articolo di correzione con correzione - Avevo smesso di scoprire che funzionava nello spazio dei nomi predefinito. – willw

+0

Puoi spostare la * risposta * dalla * domanda * e in una * risposta *? – phihag

risposta

0

Ok così ho fatto qualche debug di codice socket.io.js e capito che è un potenziale bug lì. Sulla linea 1050 viene usato un loc.hostname al posto di loc.host. Ciò causa l'utilizzo di un nome host quando si passa in uno spazio dei nomi, questo non include il numero di porta.
In caso di assenza di spazio dei nomi, sulla riga 1024 viene utilizzato loc.host e tutto è a posto.
Ho preso una copia del file e ho cambiato la riga 1050 per usare l'host e tutto funziona correttamente.
problema github Trovato con questo, è fissato in 1.4.x: https://github.com/Automattic/socket.io-client/issues/812

0

Non c'è bisogno di pasticciare con le porte, è più o meno dovrebbe funzionare solo con

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

Non credo che ci sia alcuna modo per far funzionare la scoperta della porta automatica senza modificare il codice Socket.io o attendere una correzione. La cosa più semplice che potresti fare è inserire l'attuale location.port includendo i due punti prima del tuo spazio dei nomi.

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

Oppure creare una nuova funzione che creerà un socket per te.

function sio(nsp) { 
    return io(':' + location.port + nsp); 
} 
Problemi correlati