2017-10-24 2 views
2

Socket.io-Client funktioniert einwandfrei, bis der Server unterbrochen wird/neu startet.Socket.io-Clientereignis-Listener hören nicht zu, nachdem der Server neu gestartet und erneut verbunden wurde

Sobald der Server wieder verfügbar ist, heißt es, dass es wieder verbunden ist, aber alle meine Client-Listener nicht mehr auslösen, wenn ein Ereignis ausgegeben wird.

Es scheint nicht viel mehr online, dies zu sein, aber von dem, was ich bisher gelesen, hier war ich versucht habe:

  1. in einem all meinen .on Zuhörern Wrapping Funktion, und ruft diese Funktion jedes Mal erneut auf, wenn die Clientbibliothek die Verbindung herstellt/herstellt.

  2. Alle meine io-Instanzen in einer Funktion, die jedes Mal eine neue Instanz zurückgibt, wenn ich sie anrufe.

  3. Behalten Sie alle meine Räume auf dem Server im Auge, und dann wieder alle von ihnen, sobald sie wieder verbunden sind.

  4. Setzen Sie 'multiplex' auf false, wenn Sie eine io-Instanz erstellen.

Keines dieser Dinge hat mir Glück gebracht.

Hier ist die relevanteste Github Frage, die keine Antwort hat: https://github.com/socketio/socket.io/issues/1633

Es scheint, da ich alle Raumnamen auf meinem Klienten haben, dass ich diese wieder zu verbinden in der Lage wäre zu ohne etwas wie Redis zu benutzen? Vielen Dank.

UPDATE: Nach einem Tag viele verschiedene Strategien zu versuchen, es scheint wie eine .auf die Schaffung (‚Verbindung‘, fn) Hörer für jeden Namespace wird die Client- und Server-Reconnect richtig

io.of('namespace').on('connection', function(){ 
     console.log("namespace connected") 
}); 
machen

Wenn Sie dies nicht haben, wird socket.io weiterhin funktionieren und eine Verbindung herstellen, aber es wird keine Verbindung mit funktionierenden Client-Listenern hergestellt.

Ich würde denken, das sollte etwas in der Bibliothek aktualisiert werden.

Wie dem auch sei, in Bezug auf mein besonderes Problem, das ich immer noch mit einem Problem bin übrig geblieben:

Ich brauche dynamische Namespaces

io.of('namespace-<id>').on('connection', function(){ 
    console.log("namespace id: <id> connected") 
}); 

Es wäre perfekt zu handhaben zu können, wenn ich Wildcard-Unterstützung hatte, etwas wie

io.of('namespace-*').on('connection', function(){ 
    console.log("namespace id: <id> connected") 
}); 

Würde meine Situation perfekt passen. Ich habe in verschiedenen Bibliotheken wie diese durchsucht um:

https://www.npmjs.com/package/socket.io-events

aber es unterstützt nur Platzhalter und regex für die Ereignisse, nicht die Namensräume.

+0

Ich denke, es ist einfacher, wenn Sie etwas Code hinzufügen ... –

+0

@RolandStarke, wenn Sie den Code für eine socket.io Handler/Raum Join/emit sieht sehen müssen, können Sie die Dokumentation hier: https://socket.io/docs/ –

+0

Ich meine deinen spezifischen Code. wie: Wie schickst du die Veranstaltung aus? Wann trittst du einem Raum bei? und so weiter .... –

Antwort

0

Die Antwort, die ich für diese Lösung kam, war, die Ereignisnamen dynamisch anstelle der Namespaces zu machen.

so statt

io.of('namespace-<id>').on('myevent', function(){ 
    console.log("namespace id: <id> connected") 
}); 

ich jedoch

io.of('namespace').on('myevent-<id>', function(){ 
    console.log("namespace id: <id> connected") 
}); 

tun, ich möchte sagen, dass der einzige Grund, warum ich das, weil, wie ich meine Bewerbung wurde Architecting tat ist. Ich wollte Namespaces verwenden, wenn es um eine Trennung von Bedenken ging (E.G. Seite zu Seite), und Räume, wenn es um die Trennung von Verhalten kam (E.G. Caching-Benachrichtigungen für zwei verschiedene Parteien, die dieselben Daten anzeigen).

Sofern Sie nicht einen konkreten Grund haben, dynamische Namespaces besonders zu bevorzugen, sollten Sie Räume verwenden, da dies für sie bestimmt ist.

Verwandte Themen