开发手册 欢迎您!
软件开发者资料库

HTTP | Node.js

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

Node.js v8.x 中文文档


目录

http#

稳定性: 2 - 稳定的

要使用 HTTP 服务器与客户端,需要 require('http')

Node.js 中的 HTTP 接口被设计成支持协议的许多特性。比如,大块编码的消息。这些接口不缓冲完整的请求或响应,用户能够以流的形式处理数据。

HTTP 消息头由一个对象表示,例如:

{ 'content-length': '123',  'content-type': 'text/plain',  'connection': 'keep-alive',  'host': 'mysite.com',  'accept': '*/*' }

键名是小写的,键值不能修改。

为了支持各种可能的 HTTP 应用,Node.js 的 HTTP API 是非常底层的。它只涉及流处理与消息解析。它把一个消息解析成消息头和消息主体,但不解析具体的消息头或消息主体。

查看 message.headers 了解如何处理重复的消息头。

接收到的原始消息头保存在 rawHeaders 属性中,它是一个 [key, value, key2, value2, ...] 数组。例如,上面的消息头对象有一个类似以下的 rawHeaders 列表:

[ 'ConTent-Length', '123456',  'content-LENGTH', '123',  'content-type', 'text/plain',  'CONNECTION', 'keep-alive',  'Host', 'mysite.com',  'accepT', '*/*' ]

http.Agent 类#

Agent 负责为 HTTP 客户端管理连接的持续与复用。它为一个给定的主机与端口维护着一个等待请求的队列,且为每个请求重复使用一个单一的 socket 连接直到队列为空,此时 socket 会被销毁或被放入一个连接池中,在连接池中等待被有着相同主机与端口的请求再次使用。是否被销毁或被放入连接池取决于 keepAlive 选项。

连接池中的连接的 TCP Keep-Alive 是开启的,但服务器仍然可能关闭闲置的连接,在这种情况下,这些连接会被移出连接池,且当一个新的 HTTP 请求被创建时再为指定的主机与端口创建一个新的连接。服务器也可能拒绝允许同一连接上有多个请求,在这种情况下,连接会为每个请求重新创建,且不能被放入连接池。Agent 仍然会创建请求到服务器,但每个请求会出现在一个新的连接。

但一个连接被客户端或服务器关闭时,它会被移出连接池。连接池中任何未被使用的 socket 会被释放,从而使 Node.js 进程在没有请求时不用保持运行。(查看 socket.unref())。

Agent 实例不再被使用时,建议 destroy() 它,因为未被使用的 socket 也会消耗操作系统资源。

当 socket 触发 'close' 事件或 'agentRemove' 事件时,它会被移出代理。当打算长时间保持打开一个 HTTP 请求且不想它留在代理中,则可以如下处理:

http.get(options, (res) => {  // 处理事情}).on('socket', (socket) => {  socket.emit('agentRemove');});

代理也可被用于单独的请求。使用 {agent: false} 作为 http.get() 函数或 http.request() 函数的选项,则会为客户端连接创建一个默认配置的一次性使用的 Agent

agent:false:

http.get({  hostname: 'localhost',  port: 80,  path: '/',  agent: false  // 创建一个新的代理,只用于本次请求}, (res) => {  // 对响应进行处理});

new Agent([options])#