我已经尝试使用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通过流发送消息?
答案 0 :(得分:1)
Koa完全基于承诺,一切都是中间件。
每个中间件都返回一个承诺(或不返回)。中间件链实际上已经“等待”,一旦中间件返回,Koa知道响应已完成并将结束流。
要确保Koa不会这样做,您必须确保中间件链不会终止。为此,您需要返回仅在完成流式传输后才能解决的Promise。
一个快速演示的技巧是返回无法解决的承诺:
return new Promise( resolve => { }});