Agent
负责管理 HTTP 客户端的连接持久性和重用。
它为给定的主机和端口维护一个待处理请求队列,为每个请求重用单独的套接字连接,直到队列为空,此时套接字被销毁或放入连接池,以便再次用于请求到同一个主机和端口。
销毁还是放入连接池取决于 keepAlive
选项。
连接池中的连接已启用 TCP Keep-Alive,但服务器仍可能关闭空闲连接,在这种情况下,它们将从连接池中删除,并且当为该主机和端口发出新的 HTTP 请求时将建立新连接。
服务器也可以拒绝通过同一连接允许多个请求,在这种情况下,必须为每个请求重新建立连接,并且不能放入连接池。
Agent
仍将向该服务器发出请求,但每个请求都将通过新连接发生。
当客户端或服务器关闭连接时,它将从连接池中删除。
连接池中任何未使用的套接字都将被销毁,以便当没有未完成的请求时不用保持 Node.js 进程运行。
(参见 [socket.unref()
])。
当不再使用时最好 [destroy()
] Agent
实例,因为未使用的套接字会消耗操作系统资源。
当套接字触发 '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) => {
// 用响应做些事情。
});