gpt4 book ai didi

javascript - 如何在 express.js 中使用服务器发送事件

转载 作者:搜寻专家 更新时间:2023-10-31 22:45:17 24 4
gpt4 key购买 nike

我用 express.js 设置我的 REST 服务器.现在我想将 sse 添加到此服务器。在我实现 this 之后sse 包,我得到一个错误。我知道我收到此错误,什么时候会尝试使用 res.send 两次,但我没有。

ERROR: Error: Can't set headers after they are sent.                                            
at ServerResponse.OutgoingMessage.setHeader (http.js:690:11)
at ServerResponse.header (/home/root/node_modules/express/lib/response.js:718:10)
at ServerResponse.send (/home/root/node_modules/express/lib/response.js:163:12)
at app.get.str (/home/root/.node_app_slot/main.js:1330:25)
at Layer.handle [as handle_request] (/home/root/node_modules/express/lib/router/layer.js:95:5)
at next (/home/root/node_modules/express/lib/router/route.js:131:13)
at sse (/home/root/node_modules/server-sent-events/index.js:35:2)
at Layer.handle [as handle_request] (/home/root/node_modules/express/lib/router/layer.js:95:5)
at next (/home/root/node_modules/express/lib/router/route.js:131:13)
at Route.dispatch (/home/root/node_modules/express/lib/router/route.js:112:3)

是否有可能我不能再在 sse 函数中使用 express 方法?例如:

app.get('/events', sse, function(req, res) {
res.send('...');
});

此外,我发现this解决方案和this .是否可以使用 res.write 函数或以其他方式而不使用其他包来制作 sse?

最佳答案

我不同意使用 Socket.IO 来实现基本的服务器发送事件。浏览器 API 非常简单,在 Express 中的实现只需要对正常响应路由进行几处更改:

app.get('/streaming', (req, res) => {

res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Connection', 'keep-alive');
res.flushHeaders(); // flush the headers to establish SSE with client

let counter = 0;
let interValID = setInterval(() => {
counter++;
if (counter >= 10) {
clearInterval(interValID);
res.end(); // terminates SSE session
return;
}
res.write(`data: ${JSON.stringify({num: counter})}\n\n`); // res.write() instead of res.send()
}, 1000);

// If client closes connection, stop sending events
res.on('close', () => {
console.log('client dropped me');
clearInterval(interValID);
res.end();
});
});
  • 根据规范设置适当的 header
  • 使用 res.flushHeaders() 建立 SSE 连接
  • 使用 res.write() 而不是 res.send() 发送数据
  • 要结束来自服务器的流,请使用 res.end()

上面的代码片段使用 setInterval() 模拟向客户端发送数据 10 秒,然后结束连接。客户端将收到丢失连接的错误消息,并自动尝试重新建立连接。为避免这种情况,您可以在出错时关闭客户端,或者让浏览器发送客户端理解的特定事件消息意味着正常关闭。如果客户端关闭连接,我们可以捕获 'close' 事件以优雅地结束服务器上的连接并停止发送事件。

express :4.17.1 Node :10.16.3

关于javascript - 如何在 express.js 中使用服务器发送事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34657222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com