web-dev-qa-db-fra.com

Comment utiliser l'interrogation longue en JavaScript natif et node.js?

Je dois implémenter long polling pour une application de chat. J'ai cherché autour de moi, mais je trouve seulement comment l'implémenter dans JavaScript en utilisant JQuery. Comment puis-je l'implémenter en utilisant uniquement native JavaScript et node.js? Pouvez-vous me guider vers certains articles ou documents pertinents?

11
user8244016

Q: Comment faire un long polling en natif Javascript en nodeJS?

R: Je suppose que vous devez d'abord comprendre comment fonctionne le modèle d'interrogation longue. Si vous n'avez aucune idée, alors la spécification RFC-6202 est un bon point de départ.

Au cas où vous seriez paresseux à lire. Il s'agit du client envoyant un request au server et attend qu'une réponse soit renvoyée.

D'après la spécification, nous savons que le client devra d'abord émettre une demande http qui a une valeur de délai d'infini ou au moins élevée. Ensuite, le serveur, qui est votre application nodeJs est censé stocker toutes les demandes entrantes dans une structure de données, essentiellement une zone d'attente. Votre application conservera essentiellement tout l'objet response jusqu'à ce qu'un événement se déclenche, puis vous répondez aux réponses de manière appropriée.

Considérez ce pseudo-code:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

var requestCounter = 0;

var responses = {
  /* Keyed by room Id =*/
  "room_abc" : [ /* array of responses */]
};

app.get('/', function (req, res) {
    requestCounter += 1;

    var room = /* assuming request is for room_abc */ "room_abc";

    // Stash the response and reply later when an event comes through
    responses[room].Push(res);

    // Every 3rd request, assume there is an event for the chat room, room_abc.
    // Reply to all of the response object for room abc.
    if (requestCounter % 3 === 0) {
        responses["room_abc"].forEach((res) => {
            res.send("room member 123 says: hi there!");
            res.end();
        });
    }
});

app.use(bodyParser.text({ type: 'text/*' }));
app.use(bodyParser.json());

app.listen(9999, function () {
    console.log('Example app listening on port 9999!')
})

Il est relativement long d'écrire un exemple de travail ici, mais le code ci-dessus est un bon exemple de la façon dont vous pouvez implémenter l'interrogation longue dans NodeJS.

Si vous avez postman installé ou curl vous pouvez faire HTTP des appels à http://localhost:9999/ en utilisant la méthode GET. Vous devriez remarquer que lors des deux premiers appels, vous n'obtiendrez pas de réponse et c'est lorsque vous avez tiré le 3ème que vous recevrez une réponse pour tous les appels précédents et en cours.

L'idée ici est de cacher d'abord l'objet response de la demande et lorsqu'un événement survient, en supposant que sur chaque troisième appel HTTP, vous parcourez ensuite toutes les réponses et y répondez. Pour le cas de votre application de chat, l'événement qui déclenche une réponse serait probablement lorsque quelqu'un envoie un message vers une salle de chat.

13
Samuel Toh