РЕДАКТИРОВАТЬ: Все хорошо! Это рабочий пример. Просто нужно условное, согласно комментарию ниже. Я обновил фрагмент кода, чтобы отразить изменение. Так много функциональности и так мало кода! Я понимаю, что вкладка вращается, потому что соединение все еще открыто - потому что я сказал ему оставаться открытым. В более реалистичном приложении c это соединение будет оставаться открытым из-за вызова xhr GET за кулисами, с сообщениями в publi sh через вызовы xhr POST.
Итак, I вроде это работает, но мне что-то не хватает, так как значок вкладки говорит, что страница постоянно загружается, а мои сообщения текут по каналам. Вот что у меня:
import express from 'express';
import redis from 'redis';
const app = express();
const port = 1244;
const redisOptions = {
url: 'redis://redis:6379/1'
}
const subscriber = redis.createClient(redisOptions);
const publisher = redis.createClient(redisOptions);
app.get('/', (_req, res) => res.send('Hello World!'))
app.get('/rooms/:roomId', (req, res) => {
// setup headers for the response in order to get the persistent HTTP connection
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
subscriber.on("message", function (channel, message) {
// res.write('id: UniqueID\n');
// res.write('event: add\n');
// res.write('retry: 10000\n');
if (req.params.roomId === channel) {
let data = "Message: " + message + " on channel: " + channel
res.write('data: ' + data + '\n\n'); // whenever you send two new line characters the message is sent automatically
}
});
subscriber.subscribe(req.params.roomId);
});
app.get('/rooms/:roomId/messages/:foo', (req, res) => {
publisher.publish(req.params.roomId, `{\"message\":\"Hello from ${req.params.foo}!\"}`);
return res.status(200).send('ok');
});
app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
А вот как это выглядит в браузере:
Как можно увидеть, что сторона pub / sub, похоже, работает, а события Sever Sent, похоже, пробиваются в браузер! Но ... есть какая-то проблема? Кажется, я не понимаю, как работает Node и его IO на основе событий. Я новичок в Node. У кого-нибудь есть мысли, как это "исправить"? Кажется, это близко, но я наткнулся на стену.