如何通过Node.js向客户端发送事件

3
我正在使用客户端向Node.js服务器发送Post请求来执行长时间的请求。在此过程中,我希望服务器端能让客户端知道已经完成了多少工作和当前的步骤。因此我想知道是否有一种方法可以让服务器端不断地发送事件,在客户端可以接收到。这类事件可以使用$(document).on() 接收。但并不限于此种方式。
似乎$.post只从服务器端获取一次数据。那么在发布后如何能够持续地接收服务器端数据呢?
3个回答

5
由于您只想从服务器向客户端发送消息,因此您也可以使用服务器发送事件(SSE)
您可以在客户端脚本中设置监听器来接收SSEs,如下所示:
var serverEvents = new EventSource('http://localhost:8080/events');
serverEvents.addEventListener('message', function(event){
    console.log(event.data);
});

浏览器将向创建新EventSource时提供的URL发送请求以建立连接,然后,从服务器端,您只需要按特定格式发送消息,例如:
data: some data

data: {"name": "bobby"}

每个单独的消息必须由一对换行符分隔。
Node.js 示例:
const http = require('http');

const server = http.createServer((req, res) => {
  if( req.url === '/events'){
    res.writeHead(200, {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Access-Control-Allow-Origin': '*'
    });
    setTimeout(() => {
      res.write('data: some data\n\n');
    }, 1000);
  }
});

server.listen(8080, '127.0.0.1');

请查看此链接以获取更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events

2

实现服务器和客户端之间的实时通信的唯一方法是使用WebSockets。正如@Nonemoticoner所提到的,最著名的websocket库是Socket.io


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接