当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Node.js http.Server 'clientError'事件用法及代码示例


事件:'clientError'

历史
版本变化
v12.0.0

如果发生 HPE_HEADER_OVERFLOW 错误,默认行为将返回 431 Request Header Fields Too Large。

v9.4.0

rawPacket 是刚刚解析的当前缓冲区。将此缓冲区添加到'clientError' 事件的错误对象中是为了使开发人员可以记录损坏的数据包。

v6.0.0

如果为 'clientError' 附加了侦听器,则在 socket 上调用 .destroy() 的默认操作将不再发生。

v0.1.94

添加于:v0.1.94


参数

如果客户端连接发出 'error' 事件,则会在此处转发。此事件的侦听器负责关闭/销毁底层套接字。例如,人们可能希望使用自定义 HTTP 响应更优雅地关闭套接字,而不是突然切断连接。

除非用户指定 <net.Socket> 以外的套接字类型,否则此事件保证会传递 <net.Socket> 类的实例,该类是 <stream.Duplex> 的子类。

默认行为是尝试使用 HTTP '400 Bad Request' 或 HTTP '431 Request Header Fields Too Large' 在 HPE_HEADER_OVERFLOW 错误的情况下尝试关闭套接字。如果套接字不可写或已经写入数据,它会立即被销毁。

socket 是错误源自的 net.Socket 对象。

const http = require('node:http');

const server = http.createServer((req, res) => {
  res.end();
});
server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(8000);

'clientError' 事件发生时,没有 requestresponse 对象,因此发送的任何 HTTP 响应,包括响应头和有效负载,都必须直接写入 socket 对象。必须注意确保响应是格式正确的 HTTP 响应消息。

errError 的一个实例,带有两个额外的列:

  • bytesParsed :Node.js 可能正确解析的请求包的字节数;
  • rawPacket :当前请求的原始数据包。

在某些情况下,客户端已经收到响应和/或套接字已经被销毁,例如 ECONNRESET 错误。在尝试向套接字发送数据之前,最好检查它是否仍然可写。

server.on('clientError', (err, socket) => {
  if (err.code === 'ECONNRESET' || !socket.writable) {
    return;
  }

  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品  'clientError'事件。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。