如何在原生 JavaScript 和 Node.js 中使用长轮询?

问题描述 投票:0回答:1

我需要为聊天应用程序实现长轮询。我到处搜索,但只找到如何使用 JQuery 在 JavaScript 中实现它。如何仅使用原生 JavaScript 和 Node.js 来实现它?你能指导我一些相关的文章或材料吗?

javascript node.js long-polling
1个回答
24
投票

问: 如何在

Javascript
中进行原生
nodeJS
长轮询?

A:我想首先你需要了解长轮询模型是如何工作的。如果您没有任何线索,那么RFC-6202规范是一个很好的起点。

这是关于客户端向

request
发送
server
并等待返回响应。

从规范中我们知道,首先客户端必须发出一个

http
请求,该请求具有无限或至少一个高超时值。然后,服务器(即您的
nodeJs
应用程序)预计会将所有传入请求存储到数据结构中,基本上是一个保存区域。您的应用程序本质上将保留所有
response
对象,直到触发事件,然后您适当地回复响应。

考虑这个伪代码:

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!')
})

在这里编写一个工作示例相对耗时,但上面的代码是一个很好的示例,说明如何在

NodeJS
中实现长轮询。

如果您安装了

postman
curl
,您可以使用方法
HTTP
http://localhost:9999/
进行
GET
调用。您应该注意到,在前两个呼叫中,您不会收到响应,而当您触发第三个呼叫时,您将收到所有先前和当前呼叫的响应。

这里的想法是,您首先存储请求的

response
对象,当事件发生时,假设在每 3 个 HTTP 调用中,然后循环遍历所有响应并回复它们。对于您的聊天应用程序的情况,触发响应的事件可能是当有人向聊天室发送消息时。

© www.soinside.com 2019 - 2024. All rights reserved.