當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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'事件。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。