我收到来自 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
我是SSE的新手,所以我可能做错了。我希望在你的帮助下。
答案 0 :(得分:1)
解决方案是在每次需要向客户端发送消息时写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();
});
解决。