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) => {// 用响应做些事情。});
