2017-12-11 18 views
-1

Ich habe eine Website im Moment, die funktioniert super, dass Express verwendet und ich habe eine Reihe von router.gets und posten. Ich benutze auch mongodb, damit ich mit req.user.username auf den Benutzernamen des Benutzers zugreifen kann.kann ich chatten ohne socketio auf dem gesamten Server zu implementieren?

Jetzt möchte ich einen Chat machen, ohne socketio für meinen gesamten Server implementieren zu müssen. Ich brauche einfach nicht socketio, wenn es nicht benötigt wird, und läuft nur auf Seiten, die den Chat haben.

Meine derzeitige Idee ist wie folgt: Wenn der Benutzer eine "getChat" Anfrage macht, schicke ich ihnen den Chat als JSON Objekt. Nach dem ersten Chat-Rendering lasse ich die Benutzer eine "waitChat" -Anfrage aufrufen. Wenn jemand anders eine Post-Anfrage zum Senden einer Nachricht macht, werde ich entweder den Chat in der "waitChat" -Abfrage absetzen ODER waitChat res.Send eine "success" -Meldung senden und dann den Benutzer eine weitere "getChat" -Anfrage machen lassen, und sei es ein endloser Kreislauf.

+0

im Grunde benötigen Sie eine Verbindung zwischen Client und Server, als Sie "etwas" benötigen, die Ihre Nachrichten an verbundene Clients "push/broadcast". Das "Etwas" ist "Socket" eine aktive Verbindung zwischen Client und Server. Was auch immer du im zweiten Teil gesagt hast, ist im Grunde deine Implementierung von "Socket", für das du bereits ein Framework 'socket.io' hast, also benutze es. – Vishrant

+0

Okay, ich denke, ich werde socketio dafür verwenden, aber wie würde ich den Benutzernamen des Benutzers bekommen, wenn sie sich mit socketio verbinden? das Problem ist nicht ich mag Socket nicht, aber ich weiß nicht, wie ich meine aktuelle Express-Setup zu kombinieren, und es – anduyang

+0

für jede Socket-Verbindung, es ist eine ID zugeordnet, und Sie müssen, welche Benutzer pflegen ist mit welcher ID verbunden. Es gibt viele Beispiele, Google Chat Beispiel in Express mit Socket io. – Vishrant

Antwort

0

Jetzt möchte ich einen Chat machen, ohne socketio für meinen gesamten Server implementieren zu müssen.

Nein, Sie können es nicht so machen. Ihr Server hat buchstäblich keine Ahnung, wenn eine Ihrer Webseiten irgendwo versucht, sich mit Ihrem Chat-Server zu verbinden. Du musst die ganze Zeit zuhören.

Außerdem scheint es, dass Sie ein Missverständnis darüber haben, was es bedeutet, auf eingehende socket.io-Verbindungen zu hören, weil ein Listener-Server, der keine Verbindungen hat, nichts tut und Sie nichts kostet. Also, "die ganze Zeit laufen" bedeutet nichts. In der Tat würde es mehr kosten, den Server zu starten, den Server anzuhalten, später neu zu starten, usw., als ihn einfach zu belassen. Außerdem klingt deine Formulierung ", ohne socketio für meinen gesamten Server implementieren zu müssen" auch so, als ob du glaubst, dass es etwas Schwerwiegendes gibt, wenn du nur einen hooking.io Server hast. Das ist überhaupt kein schweres Konzept.

Darüber hinaus gibt es absolut keinen Nachteil, dass Ihr socket.io Server nur die ganze Zeit hört. Wenn Sie eine eingehende socket.io-Verbindung entweder über einen zuvor festgelegten Cookie oder mit einer anderen Authentifizierungsmethode authentifizieren möchten, können Sie eine Authentifizierung implementieren, sodass nur autorisierte Benutzer eine Verbindung herstellen können.


Ich verfolge nicht ganz, worüber Sie sprechen, mit waitChat und getChat. Die Idee hinter Chat ist, dass BenutzerA eine Nachricht senden kann, die an BenutzerB geliefert wird. Das Konzept dafür ist, dass userA eine Nachricht an den Server sendet und der Server diese dann an userB liefert.

Es ist offensichtlich einfach für BenutzerA, eine Nachricht an den Server zu senden. Das kann auf verschiedene Arten geschehen. Die Frage ist, wie der Server die Nachricht an userB liefert. Wie Sie wissen, kann der Server nicht einfach direkt mit UserB Kontakt aufnehmen. Die Art und Weise, dies zu tun, ist:

  1. userB regelmäßig Umfragen der Server für etwas Neues zu fragen
  2. userB verwendet „Lang-Abfrage“, die auch Polling ist, sondern eine spezielle Version, wo der Server auf die Abfrageanforderung hält für eine Weile und dann kehrt entweder zurück, wenn es einige Daten oder Zeiten gibt und dann muss der Client erneut abfragen
  3. userB macht eine dauerhafte webSocket oder socket.io Verbindung zum Server und dann kann der Server Daten über diese Verbindung an den Client senden Jederzeit.

Die webSocket oder Socket.Die Verbindung ist bei weitem die effizienteste, und tatsächlich wurde das gesamte Konzept erfunden und dem Browser hinzugefügt, weil die beiden Abfrage-Schemata nicht sehr effizient oder skalierbar sind.

+0

in Ordnung, also ich denke, ich werde socketio dafür verwenden, aber wie würde ich den Benutzernamen des Benutzers bekommen, wenn sie mit socketio verbinden? das Problem ist nicht ich mag Socket nicht, aber ich weiß nicht, wie ich meine aktuelle Express-Setup kombinieren, und es – anduyang

+0

@anduyang - Cookies sind verfügbar, wenn die socket.io Verbindung verbindet. So, wie Sie wissen würden, wer der Benutzer mit einer HTTP-Anforderung ist, funktioniert für eine Verbindung von socket.io. Tatsächlich beginnt eine socket.io-Verbindung mit einer http-Anfrage (weshalb Cookies verfügbar sind). – jfriend00

Verwandte Themen