本文档解释了 Node.js 中 HTTP 和网络的功能,涵盖了 HTTP 和 HTTPS 模块。它详细介绍了 HTTP 服务器、客户端、连接管理、消息处理以及用于监控 HTTP 操作的诊断等关键组件。有关底层网络功能的信息,请参阅关于 `net` 模块的文档。
Node.js 中的 HTTP 实现被设计为一个低级 API,专注于流处理和消息解析。它构建在流模块和 Node.js 的网络功能之上。
来源: lib/http.js126-151 lib/https.js58-138 lib/_http_server.js534-577 lib/_http_client.js137-390 lib/_http_agent.js81-107
HTTP 模块包含几个关键类
每个组件处理 HTTP 协议的不同方面,协同工作以提供完整的 HTTP 实现。
来源: lib/http.js12-37 lib/_http_server.js196-236 lib/_http_client.js137-390 lib/_http_incoming.js49-94 lib/_http_outgoing.js104-158 lib/_http_agent.js81-107
Node.js 中的 HTTP 消息表示为具有头部和正文内容的属性。头部表示被标准化,以便更容易使用
头部以原始形式(保留大小写和顺序)和解析后的形式(小写键)存储。正文内容通过 Stream 接口处理,允许高效的数据处理。
来源: lib/_http_incoming.js49-94 lib/_http_incoming.js107-185 doc/api/http.md18-51
服务器监听 HTTP 请求并通过提供的回调处理它们。
来源: lib/http.js62-64 lib/_http_server.js534-577
此流程展示了 HTTP 服务器如何处理入站请求,通过 HTTP 解析器处理它们,并将响应发送回客户端。
来源: lib/_http_server.js660-730 lib/_http_server.js135-176 lib/_http_common.js71-118
服务器通过连接跟踪系统管理连接。它包括以下功能:
来源: lib/_http_server.js516-529 lib/_http_server.js583-612 lib/_http_server.js614-619
来源: lib/http.js112-116 lib/_http_client.js137-390
此图说明了 HTTP 请求的完整生命周期,包括通过 Agent 进行的连接管理。
来源: lib/_http_client.js346-383 lib/_http_client.js577-586 lib/_http_agent.js116-179
HTTP Agent 管理客户端连接,通过连接池和连接复用提高性能。
Agent 为每个唯一的 host:port 组合管理一个套接字池,控制并发连接的数量和复用方式。
来源: lib/_http_agent.js81-107 lib/_http_agent.js230-282 lib/_http_agent.js328-349
来源: lib/_http_agent.js81-107 lib/http.js130-145
此继承关系展示了主要的 HTTP 消息类之间的继承关系。
来源: lib/_http_outgoing.js104-158 lib/_http_incoming.js49-94 lib/_http_server.js196-236 lib/_http_client.js137-390
Node.js 中的 Headers 通过多种方法管理
| 类 | 设置 Headers | 读取 Headers | 其他操作 |
|---|---|---|---|
| OutgoingMessage | setHeader(name, value)setHeaders(headers)appendHeader(name, value) | getHeader(name)getHeaders()getHeaderNames() | removeHeader(name)hasHeader(name) |
| IncomingMessage | N/A (只读) | headers 属性rawHeaders 属性headersDistinct 属性 | 不适用 |
通过 headers 对象访问时,Headers 会被规范化(转为小写),但原始的大小写会在 rawHeaders 中保留。
来源: lib/_http_outgoing.js639-664 lib/_http_outgoing.js796-832 lib/_http_incoming.js107-185
HTTPS 功能通过 TLS/SSL 功能扩展了 HTTP 组件。
HTTPS 实现提供了与 HTTP 相同的 API,但增加了 TLS 配置选项。
来源: lib/https.js62-102 lib/https.js206-225 lib/https.js364-420
来源: lib/https.js62-102 lib/https.js134-136
来源: lib/https.js364-382 lib/https.js416-420
Node.js 提供了诊断通道用于监控 HTTP 操作,无需修改应用程序代码即可实现可观测性。
| 通道名称 | 描述 | 提供的数据 |
|---|---|---|
http.client.request.created | 创建客户端请求时触发 | { request } |
http.client.request.start | 客户端请求开始时触发 | { request } |
http.client.request.error | 客户端请求出错时触发 | { request, error } |
http.client.response.finish | 客户端响应完成时触发 | { request, response } |
http.server.request.start | 服务器开始处理请求时触发 | { request, response, socket, server } |
http.server.response.created | 创建服务器响应时触发 | { request, response } |
http.server.response.finish | 服务器响应完成时触发 | { request, response, socket, server } |
来源: lib/_http_client.js92-105 lib/_http_server.js98-102 test/parallel/test-diagnostics-channel-http.js15-67
来源: lib/diagnostics_channel.js102-116 lib/diagnostics_channel.js162-173 test/parallel/test-diagnostics-channel-http.js15-67
HTTP Agent 可以针对不同的性能特性进行调整
来源: lib/_http_agent.js81-107 lib/_http_agent.js104-107
为了获得最佳的 HTTP 请求和响应性能
来源: lib/_http_outgoing.js339-392 lib/_http_client.js275-290
HTTP 应用中的正确错误处理至关重要。关键的错误事件和模式包括: