Koa SSE“写完”

时间:2018-11-26 14:43:33

标签: server-sent-events koa

我已经尝试使用Koa实施SSE流几个小时了,但是在初始化连接后尝试向客户端发送消息时出现以下错误。

  

错误[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);
};

服务器端(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 :(得分:1)

Koa完全基于承诺,一切都是中间件。

每个中间件都返回一个承诺(或不返回)。中间件链实际上已经“等待”,一旦中间件返回,Koa知道响应已完成并将结束流。

要确保Koa不会这样做,您必须确保中间件链不会终止。为此,您需要返回仅在完成流式传输后才能解决的Promise。

一个快速演示的技巧是返回无法解决的承诺:

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