首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >koa和sse,消息被延迟

koa和sse,消息被延迟
EN

Stack Overflow用户
提问于 2019-03-11 18:47:52
回答 1查看 239关注 0票数 0

我有一个cpu密集型的任务在服务器上,当它运行时,我想告诉客户端的进度,有一个良好的用户体验,我看了SSE使用koa-sse-stream,我的问题所述的问题客户端是得到所有的消息在响应的末尾是错误的,消息必须到达,因为他们产生了。

/event路由处理程序:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2019-03-11 21:24:44

问题是我等待解决的承诺阻止了koa-sse-stream将其流传输到ctx.body。一旦我删除了它,一切都像预期的那样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55100110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档