客户端中止不会在Node 16中触发Node.js请求的“close”事件

2guxujil  于 2023-05-17  发布在  Node.js
关注(0)|答案(1)|浏览(113)

我正在构建一个express应用程序,它使用res.write(json)将数据流传输到客户端,这应该考虑客户端中的fetch异常中止。
在节点14中,我这样做是为了检测中止:

req.on("close", () => {
  // handle the abort
})

然而,当升级到Node 16时,这个事件不再触发,通过一些试验和错误,我发现我们必须在响应对象上这样做:

res.on("close", () => {
  // handle the abort
})

在客户身上,我在做

fetch(url, {
            headers: {
              "Content-Type": "application/json",
            },
            method: "POST",
            body: jsonParams,
            signal: signal,
          })

并且当请求有效载荷可用时,请求上的“关闭”事件立即触发(与节点14中相反)。
这是从节点14到节点16的破坏性http处理更改吗?我在网上没有找到很多关于这个的东西。

mnemlml8

mnemlml81#

是的,这是一个突破性的变化。See this issue,它描述了以下内容:
现在,当请求完成时,而不是当基础套接字关闭时,将发出close事件。
根据您的用例,您可以切换到req.socket并在那里列出close,它应该具有类似于(但不完全)Node v14的行为。

相关问题