【问题标题】:Use Koa for Server-Sent Events使用 Koa 处理服务器发送的事件
【发布时间】:2019-04-16 18:52:10
【问题描述】:

在使用 Express 实现 SSE 后,我想像这样对 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 请求的路由,但它失败了。

【问题讨论】:

    标签: server-sent-events koa koa-router


    【解决方案1】:

    这里的一个主要问题是 Koa 将在所有中间件运行后立即“结束”HTTP 响应。

    这会在函数结束后立即发生,如果函数返回一个承诺,当承诺已经解决时。要保持连接打开并规避 Koa 的响应处理,您需要确保函数“永不结束”,而做到这一点的最佳方法是简单地返回一个无法解析的 Promise。

    您实际上是在接管响应处理并阻止 Koa 这样做。此时您可以开始使用套接字进行操作了。

    我不确定在 Koa 中是否存在更合适的方法来处理此问题,但这是我过去解决此问题的方法。

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      相关资源
      最近更新 更多