React und Socket.io: Kann erste Daten erhalten - aber die Ansicht wird nicht aktualisiert, wenn ein neuer Post eintrifft

8

Ich bin mir nicht sicher, ob das Problem darin besteht, wie ich meine Sockets eingerichtet habe - oder ob ich falsch versuche, die Daten mit React zu rendern.

Ich kann erfolgreich Daten mit meinem Socket abrufen - aber es gibt keinen Update-Zustand, wenn neue Daten auf dem Server veröffentlicht werden. Meine Absicht ist, dass der Zustand in React automatisch neue Daten rendert, die wegen der Socket-Verbindung immer live sind.

Hier ist meine Client-App, die Nachrichten vom Server erhält und sie rendert:

%Vor%

Nur für den Fall hier ist mein Server-Code, der Daten ausgibt:

%Vor%     
fresh5447 15.04.2016, 05:42
quelle

4 Antworten

4

Versuchen Sie Folgendes:

%Vor%     
dwww 15.04.2016 19:56
quelle
4

Von jetzt an greifen Sie "nur" Daten vom Server, sobald die Komponente geladen wurde. Um etwas mehr "Echtzeit" zu erhalten, wollen Sie entweder den Server mit der gleichen emit -Anweisung anpingen, die Sie regelmäßig angegeben haben (was die Verwendung von Websockets vereitelt, wirklich, Sie könnten Long-Polling verwenden) Server sendet regelmäßig neue Daten an alle Clients.

Sie können ENTWEDER tun:

A) Client-Seite: "Polling" für Informationen [nicht ideal]

Hinweis: Ich habe dies zunächst in meine Antwort eingefügt, weil ich gesehen habe, dass das OP "polling" war, als der Controller geladen wurde. Ich habe nicht darauf geklickt, dass dies möglicherweise der Fall ist, da der Controller möglicherweise nicht mit dem WebSocket geladen ist, so dass das Senden von Daten über die Verbindung hier möglicherweise nicht funktioniert. Mein Schlechter.

Ersetzen Sie socket.emit('getMessages') durch etwas, das den Websocket regelmäßig nach Daten abfragt:

%Vor%

ODER

B) Server-Seite: Senden Sie neue Daten, sobald sie verfügbar sind. [Bester Weg]

Verfolgen Sie alle Clients über ein Client-Array und löschen Sie sie, wenn ihre Sitzung beendet ist.

%Vor%

Führen Sie diesen Code aus, wenn Sie neue Nachrichten aus der Datenbank / dem Datenspeicher übertragen müssen:

%Vor%     
Micheal Harker 21.04.2016 12:47
quelle
3

Ihr Servercode wird nur beim ersten Socket connection ausgelöst.

Server:

%Vor%

Kunde:

%Vor%

Basierend auf der Namenskonvention scheint es auch, dass Ihre Message.find() eine einzelne Nachricht zieht. Ich würde empfehlen, die Beschriftung zu verdeutlichen, um die Kardinalität anzupassen.

    
kwcto 15.04.2016 05:56
quelle
1

Könnte es aufgrund der componentWillMount-Lebenszyklusmethode möglich sein? Könnten Sie stattdessen den ComponentDidMount ausprobieren?

Es sieht so aus, als würde der Rendervorgang die Statusaktualisierung anzeigen, aber nur einmal ausgeführt, obwohl die Statusänderung gemäß facebook .

    
Jack7 22.04.2016 04:38
quelle

Tags und Links