Node.js服务器发送事件 - 何时使用response.flushHeaders()和response.writeHead()

8

我正在使用NodeJS和Express编写应用程序的服务器端部分,该部分将使用Server-Sent-Events(SSE)。目前我有一个似乎可行的解决方案,但需要了解是否有更好的NodeJS实现方式。

目前相关代码如下:

const headers = {
    'Content-Type': 'text/event-stream',
    'Connection': 'keep-alive',
    'Cache-Control': 'no-cache',
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Credentials': 'true'
};
res.writeHead(200, headers);

// Do more stuff [...]            

res 是响应对象。

有些示例中,使用 res.flushHeaders() 而不是调用 res.writeHead()

res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Connection', 'keep-alive');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Credentials', 'true');
res.flushHeaders();

这两者有区别吗?哪种更好,特别是在使用 SSE 并保持连接以发送消息方面?


当您使用res.writeHead时,客户端是否会收到数据块?还是在使用res.flushHeaders时客户端会收到数据块? - Shiv
2个回答

2

我也有同样的问题。除了Walters的回答,我还发现以下内容:

writeHeadflushHeaders都是expressjsnodejs中使用的方法,你不需要使用这两个方法来正确实现SSE。对于传递头文件,你需要使用writeHeadsetHeader

response.flushHeaders()用于绕过请求头缓冲。通过测试,我可以确认它对于SSE的正常工作并非必需。因此,使用它将基于您特定的应用通信需求,而不是SSE的需求。

使用response.writeHead()是使用setHeader的首选替代方法。如果需要逐步填充标题并可能在将来进行检索和修改,则应改用response.setHeader()

writeHeadflushHeaders都不用于保持连接保持打开状态。连接默认会保持打开状态,直到客户端断开连接或您在服务器上使用response.end()response.send()关闭它这将调用end。唯一的例外是HTTP默认超时时间

明确指定statusCode代码是基于您的使用,但不是必需的(除非您使用response.writeHead())。例如,您可以使用响应代码告诉客户端通过使用HTTP 204无内容响应代码停止重新连接注意:对于使用compressionexpressjs用户,请确保在res.write()之后调用res.flush()方法(compression中间件提供),根据文档

这里有一个包含完整示例的仓库。关于服务器sse部分,请参见此文件


1
它们几乎是等效的,因为res.write()会随着第一块数据刷新标头。对于SSE,您很可能需要立即响应,至少要指示成功连接。res.setHeader()如果以后需要访问或修改标题状态,则可能有用,但这似乎与SSE无关。
请参阅nodejs.org文档response.write()response.setHeader()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接