Как бы вы настроили Node для обработки SSE с помощью Redis pub / sub? - PullRequest
1 голос
/ 05 мая 2020

РЕДАКТИРОВАТЬ: Все хорошо! Это рабочий пример. Просто нужно условное, согласно комментарию ниже. Я обновил фрагмент кода, чтобы отразить изменение. Так много функциональности и так мало кода! Я понимаю, что вкладка вращается, потому что соединение все еще открыто - потому что я сказал ему оставаться открытым. В более реалистичном приложении 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}`))

А вот как это выглядит в браузере:

app responses

Как можно увидеть, что сторона pub / sub, похоже, работает, а события Sever Sent, похоже, пробиваются в браузер! Но ... есть какая-то проблема? Кажется, я не понимаю, как работает Node и его IO на основе событий. Я новичок в Node. У кого-нибудь есть мысли, как это "исправить"? Кажется, это близко, но я наткнулся на стену.

...