Используйте Koa для событий, отправленных сервером

После внедрения SSE с Express я хотел сделать то же самое с Koa вот так:

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

router.get('/stream', (ctx, next) => {
  ctx.set({
    'Access-Control-Allow-Origin': '*',
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    Connection: 'Keep-Alive',
  });

  const id = new Date().toLocaleTimeString();
  ctx.res.write(`id: ${id}'\n`);
  ctx.res.write(`data: CONNECTION ESTABLISHED)}\n\n`);
  next();
});

app.use(router.routes());

app.listen(8080, () => {
  console.log('Listening on port 8080');
});

А для моего клиента в конструкторе компонента React:

constructor(props) {
    super(props);

    this.state = {
      source: new EventSource("http://localhost:8080/stream"),
    };
}

Но по какой-то причине я получил следующее сообщение об ошибке на стороне клиента:

Firefox не может установить соединение с сервером по адресу http://localhost:8080/stream.

Несмотря на то, что запрос моего клиента к /stream проходит (но ответ не отправляется).

Что могло вызвать эту проблему с соединением SSE?

У меня есть сервер Koa, который прослушивает данный порт, маршрут для перехвата начального запроса GET с правильными данными заголовка, но он не работает.


person Christopher    schedule 13.11.2018    source источник


Ответы (1)


Основная проблема здесь в том, что Koa «завершит» HTTP-ответ, как только все промежуточное ПО будет запущено.

Это происходит сразу после завершения функции, если функция возвращает обещание, когда обещание было разрешено. Чтобы поддерживать соединение открытым и обходить обработку ответов Koa, вам необходимо убедиться, что функция «никогда не заканчивается», и лучший способ сделать это - просто вернуть обещание, которое не выполняется.

Вы эффективно берете на себя обработку ответов и не позволяете Коа делать это. На этом этапе вы можете начать что-то делать с сокетом.

Я не уверен, существует ли более подходящий способ справиться с этим в Koa, но именно так я решал это в прошлом.

person Evert    schedule 13.05.2019