• exception {Error}
    • socket {stream.Duplex}

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

    此事件保证传入 {net.Socket} 类({stream.Duplex} 的子类)的实例,除非用户指定了 {net.Socket} 以外的套接字类型。

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

    socket 是发生错误的 [net.Socket] 对象。

    1. const http = require('http');
    2. const server = http.createServer((req, res) => {
    3. res.end();
    4. });
    5. server.on('clientError', (err, socket) => {
    6. socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
    7. });
    8. server.listen(8000);

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

    errError 实例,有以下两个额外的部分:

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

    In some cases, the client has already received the response and/or the socket has already been destroyed, like in case of ECONNRESET errors. Before trying to send data to the socket, it is better to check that it is still writable.

    1. server.on('clientError', (err, socket) => {
    2. if (err.code === 'ECONNRESET' || !socket.writable) {
    3. return;
    4. }
    5. socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
    6. });