服务器使用NodeJS和Redis发送事件

Server Sent Events using NodeJS and Redis

本文关键字:事件 Redis NodeJS 服务器      更新时间:2023-09-26

我从Redis数据库接收更新(消息),我需要在客户端上实时显示这些消息,为此我使用SSE(服务器发送事件)。

所以,我的代码看起来是这样的:

客户端javascript:

var source = new EventSource('/updates');
source.addEventListener('pmessage', function(e) {
  console.log('Event: ' + e.event);
  console.log('Data: ' + e.data);
}, false);

服务器端(Node+Express):

    req.socket.setTimeout(Infinity);
    var redisURL = url.parse(process.env.REDISCLOUD_URL);
    var client = redis.createClient(redisURL.port, redisURL.hostname, {ignore_subscribe_messages: true});
    client.auth(redisURL.auth.split(":")[1]);
    client.psubscribe('updates');
    client.on('error', function (err) {
    console.log('Error: ' + err);
  });
  client.on('psubscribe', function (pattern, count) {
    console.log('psubscribe pattern: ' + pattern);
    console.log('psubscribe count: ' + count);
  });
  client.on('pmessage', function (pattern, channel, message) {
    console.log('pmessage pattern: ' + pattern);
    console.log('pmessage from channel: ' + channel);
    console.log('pmessage message: ' + message);
    res.write("data: " + message + ''n'n');
  });
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  });
  res.write(''n');

我没有收到任何从服务器到客户端的更新(服务器正确地接收到来自redis的消息)。

如果我刷新服务器,我会收到以下错误:net::ERR_INCOMPLETE_CHUNKED_ENCODING

我是苏格兰和南方能源公司的新手,所以我可能做错了。我希望得到你的帮助。

解决方案是在每次需要向客户端发送消息时编写res.flush(),在我的情况下:

  client.on('pmessage', function (pattern, channel, message) {
    console.log('pmessage pattern: ' + pattern);
    console.log('pmessage from channel: ' + channel);
    console.log('pmessage message: ' + message);
    res.write("data: " + message + ''n'n');
    res.flush();
  });

已解决。