Коа SSE "пиши после конца" - PullRequest
0 голосов
/ 26 ноября 2018

Я уже несколько часов пытаюсь реализовать поток SSE с Koa, но при попытке отправить сообщение моему клиенту после инициализации соединения получаю следующую ошибку:

Ошибка [ERR_STREAM_WRITE_AFTER_END]:запись после окончания

Вот как я настроил свой SSE:

На стороне клиента:

const source = new EventSource("http://localhost:8080/stream");

this.source.onmessage = (e) => {
  console.log("---- RECEIVED MESSAGE: ", e.data);
};

// Catches errors
this.source.onerror = (e) => {
  console.log("---- ERROR: ", e.data);
};

Сервер-side (Koa):

// Entry point to our SSE stream
router.get('/stream', ctx => {

  // Set response status, type and headers
  ctx.response.status = 200;
  ctx.response.type = 'text/event-stream';
  ctx.response.set({
    'Cache-Control': 'no-cache',
    Connection: 'keep-alive',
  });

  // Called when another route is reached
  // Should send to the client the following
  ctx.app.on('message', data => {
    ctx.res.write(`event: Test\n`);
    ctx.res.write(`data: This is test data\n\n`);
  });   
});

Ошибка возникает, когда мы вызываем ctx.res.write после получения сообщения.

Почему мой поток завершился, хотя ничего явно не делает?Как я могу отправить сообщение через поток с Koa?

1 Ответ

0 голосов
/ 26 ноября 2018

Koa полностью основан на обещаниях, а все является промежуточным ПО.

Каждое промежуточное ПО возвращает обещание (или ничего).Цепочка промежуточного программного обеспечения фактически «ожидаема», и как только промежуточное программное обеспечение вернется, Коа узнает, что ответ выполнен, и завершит поток.

Чтобы убедиться, что Коа этого не делает, вы должны убедиться, чтоцепочка промежуточного программного обеспечения не заканчивается.Для этого вам нужно вернуть обещание, которое разрешается только после завершения потоковой передачи.

Быстрый способ продемонстрировать это возвращение обещания, которое не разрешается:

return new Promise( resolve => { }});
...