如何在本机JavaScript和node.js中使用长轮询?

如何在本机JavaScript和node.js中使用长轮询?,javascript,node.js,long-polling,Javascript,Node.js,Long Polling,我需要为聊天应用程序实现长轮询。我到处搜索过,但我只找到了如何使用JQuery在JavaScript中实现它。如何仅使用本机JavaScript和node.js实现它?你能给我介绍一些相关的文章或资料吗?Q:如何在nodeJS中使用本机Javascript进行长时间轮询 A:我想首先您需要了解长轮询模型是如何工作的。如果你还没有任何线索,那么这是一个很好的起点 它是关于客户端向服务器发送请求,并等待响应返回 从规范中我们知道,首先客户端必须发出一个http请求,该请求具有无限或至少一个高超时值。

我需要为聊天应用程序实现
长轮询
。我到处搜索过,但我只找到了如何使用
JQuery在
JavaScript
中实现它。如何仅使用
本机JavaScript
node.js
实现它?你能给我介绍一些相关的文章或资料吗?

Q:如何在
nodeJS
中使用本机
Javascript
进行长时间轮询

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

它是关于客户端向
服务器发送
请求
,并等待响应返回

从规范中我们知道,首先客户端必须发出一个
http
请求,该请求具有无限或至少一个高超时值。然后,服务器(即您的
nodeJs
应用程序)将把所有传入的请求隐藏到一个数据结构中,基本上是一个等待区域。您的应用程序基本上会保留所有
响应
对象,直到触发事件,然后您会相应地回复响应

考虑以下伪代码:

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
。您应该注意到,在前两次呼叫中,您不会得到响应,只有在您触发第三次呼叫时,您才会收到以前和当前所有呼叫的响应


这里的想法是首先隐藏请求的
响应
对象,当一个事件通过时,假设每第三次HTTP调用一次,然后循环通过所有响应并回复它们。就您的聊天应用程序而言,触发响应的事件可能是有人向聊天室发送消息。

我建议您查看一下套接字,而不是长轮询,它比长轮询更有效(ps:我最近才知道什么是长轮询,所以我无法帮您回答问题)您好,我不允许使用插座,这是我项目中的一项要求,虽然插座更专业,我在以前的项目中也使用过。嗨,谢谢你的回答,但我有一个问题,当一些用户向房间发送消息时,我可以用计数器值来检查是否有新消息的条件来替换上一个条件吗?也就是说,如果计数器值大于我已有的值,那么聊天室中应该显示新消息,对吗?还有一件事,我如何使用本机javascript在客户端“调用”服务器?我想您需要有两个端点。一个供客户停车等待响应。这在上文中得到了证明。然后是另一个客户端发布聊天信息的窗口。编写消息时,您需要检查该房间的所有
响应
对象,并适当地答复它们。关于客户端如何发送消息的其他问题,请拨打
HTTP
rest呼叫。例如,请参阅您的代码示例不显示长轮询,它实际上显示的内容既不是长轮询也不是短轮询。对于长轮询,如果在发出请求时数据不可用,将保持连接,当数据可用时,将发送响应。如果数据在超时之前不可用,则应通过超时中止连接。