koa и sse, сообщения задерживаются - PullRequest
0 голосов
/ 11 марта 2019

У меня есть задача с интенсивным использованием процессора на сервере, и пока она выполняется, я хочу рассказать клиенту о прогрессе, чтобы иметь хороший пользовательский опыт, я посмотрел на SSE с помощью koa-sse-stream, моя проблема, как указано в вопросе клиент получает все сообщения в конце ответа, который является неправильным, сообщения должны прибыть, поскольку они произведены.

/ обработчик маршрута события:

import { isObject } from 'util';

import koarouter from 'koa-router';
import koasse from 'koa-sse-stream';
import ipc from 'node-ipc';

ipc.config.maxRetries = 1;
ipc.config.stopRetrying = true;
ipc.config.retry = false;
ipc.config.appspace = 'alerts_event';
ipc.config.silent = true;

const router = new koarouter();

router.get(
  '/event',
  koasse(),
  async (ctx, next) => {
    const { client_id } = ctx.state;
    // const sse = new SimpleSSE(ctx, false);
    let resolver: () => void;
    const p = new Promise(res => {
      resolver = res;
    });
    ipc.serve(client_id, () => {
      ipc.server.on('message', (data, socket) => {
        if (isObject(data)) {
          ctx.sse.send(data);
        }
      });
      ipc.server.on('socket.disconnected', _ => {
        ctx.sse.end();
        resolver();
      });
    });
    ipc.server.start();
    await p;
    ipc.server.stop();
    await next();
  },
  async ctx => {
    console.log(ctx.res.getHeaders());
  },
);

export default router;

клиент HTML:

<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <h6 id="display"></h6>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script>
      const display = document.getElementById('display');
      const es = new EventSource('/alerts/v1/event');
      es.onmessage = msg => {
        console.log('got message from server');
        console.log(msg);
        display.innerHTML = msg.data;
      };
      es.onerror = err => {
        console.log('got error');
        console.log(err);
      };
      axios({
        method: 'get',
        url: 'http://localhost:4001/alerts/v1/xlsx',
      })
        .then(data => {
          console.log(data);
          es.close();
        })
        .catch(err => console.log(err));
    </script>
  </body>
</html>

1 Ответ

0 голосов
/ 11 марта 2019

Проблема заключалась в том, что обещание, которое я жду, чтобы решить его, остановило koa-sse-stream от передачи его потока в ctx.body.Как только я удалил его, все заработало как положено.

...