koa和sse,消息被延迟了

问题描述 投票:0回答:1

我在服务器上有一个cpu密集型任务,而它的运行我想告诉客户端进展有良好的用户体验,我用koa-sse-stream查看SSE,我的问题如客户端问题中所述在响应结束时获取所有错误消息,消息必须在生成时到达。

/ event route handler:

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>
node.js typescript server-sent-events koa
1个回答
0
投票

问题在于我等待解决它的承诺停止koa-sse-stream将其流传输到ctx.body。一旦我删除它一切按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.