Используйте Koa для событий, отправленных сервером - PullRequest
0 голосов
/ 14 ноября 2018

После внедрения 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 с правильными данными заголовка, и все же он терпит неудачу.

1 Ответ

0 голосов
/ 13 мая 2019

Основная проблема заключается в том, что Koa завершит HTTP-ответ, как только запустится все промежуточное программное обеспечение.

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

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

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

...