2017-07-18 8 views
2

Ich bin neu zu Knoten und Socket io. Ich versuche, ein Echtzeit-Benachrichtigungssystem für einige meiner eigenen Apps zu implementieren. Also, mit Knoten, Express- und Buchse io, wird der Code unten angegeben:Die socket.io sendet an alle Räume anstelle der angegebenen

Server Side-Code:

io.on('connection', function (socket) { 

    socket.on('subscribe', function(room) { 
     socket.join(room); 
    }); 

    socket.on('unsubscribe', function(room) { 
     socket.leave(room); 
    }); 
}); 

Client Side-Code:

var sio = io.connect('http://localhost:9000'); 

var ch1 = sio.emit('subscribe', 'channel1'); 

ch1.on('log', function (data) { 
    console.log('channel1: ', data); 
}); 

var ch2 = sio.emit('subscribe', 'channel2'); 

ch2.on('log', function (data) { 
    console.log('channel2: ', data); 
}); 

Ich bin Brennen/Emittieren der Veranstaltung von einer Route (Express) zum Beispiel:

app.get('/', function(req, res) { 

    var data1 = { 
     channel: 'channel1', 
     evennt: 'log', 
     message: 'Hello from channel1...' 
    }; 

    io.to(data1.channel).emit(data1.event, data1); 
}); 

Wenn ich die Strecke bin schlagen, ist die io.to(data1.channel).emit(data1.event, data1); Arbeit ing aber die Daten auf beide Zimmer/Kanäle zu senden, aber ich hatte erwartet, um die Daten zu erhalten, nur in ch1 weil data1.channel enthält channel1 so bekam ich die folgende Prozedur erwartet die Daten erhalten:

ch1.on('log', function (data) { 
    console.log('channel1: ', data); 
}); 

Beachten Sie, dass beide Kanäle habe dasselbe log Ereignis. Bin ich auf dem richtigen Weg? Ist es überhaupt möglich?

+0

Sie vertippt 'channel' in der Erklärung von' data1'. – robertklep

+0

Es war ein Tippfehler hier, aber es funktioniert auch nicht. –

Antwort

0
var ch1 = sio.emit('subscribe', 'channel1'); 
var ch2 = sio.emit('subscribe', 'channel2'); 

Sie abonnieren die gleiche Buchse (sio) zu beiden Zimmern. Auch ch1 und ch2 sind Verweise auf sio.

Wenn Sie es richtig testen möchten, sollten Sie eine zweite Buchse für den zweiten Kanal erstellen:

var sio2 = io.connect('http://localhost:9000'); 
var ch2 = sio2.emit('subscribe', 'channel2'); 
+0

Sie möchten mehrere Sockets erstellen, in denen jeder Socket einen anderen Raum abonniert, aber alle Sockets die gleiche Verbindung haben? Ist das korrekt? – robertklep

+0

Ja, genau !!! –

+0

Durch Aufruf von 'sio2 = io.connect ('http: // localhost: 9000') funktioniert das, aber das sind zwei verschiedene Verbindungen. –

Verwandte Themen