Agent 负责管理 HTTP 客户端的连接持久性和重用。 它为给定的主机和端口维护一个待处理请求队列,为每个请求重用单独的套接字连接,直到队列为空,此时套接字被销毁或放入连接池,以便再次用于请求到同一个主机和端口。 销毁还是放入连接池取决于 keepAlive 选项

    连接池中的连接已启用 TCP Keep-Alive,但服务器仍可能关闭空闲连接,在这种情况下,它们将从连接池中删除,并且当为该主机和端口发出新的 HTTP 请求时将建立新连接。 服务器也可以拒绝通过同一连接允许多个请求,在这种情况下,必须为每个请求重新建立连接,并且不能放入连接池。 Agent 仍将向该服务器发出请求,但每个请求都将通过新连接发生。

    当客户端或服务器关闭连接时,它将从连接池中删除。 连接池中任何未使用的套接字都将被销毁,以便当没有未完成的请求时不用保持 Node.js 进程运行。 (参见 [socket.unref()])。

    当不再使用时最好 [destroy()] Agent 实例,因为未使用的套接字会消耗操作系统资源。

    当套接字触发 'close' 事件或 'agentRemove' 事件时,则套接字将从代理中删除。 当打算长时间保持一个 HTTP 请求打开而不将其保留在代理中时,可以执行以下操作:

    1. http.get(options, (res) => {
    2. // 做些事情。
    3. }).on('socket', (socket) => {
    4. socket.emit('agentRemove');
    5. });

    代理也可以用于单个请求。 通过提供 {agent: false} 作为 http.get()http.request() 函数的选项,则将使用一次性的具有默认选项的 Agent 用于客户端连接。

    agent:false 的示例:

    1. http.get({
    2. hostname: 'localhost',
    3. port: 80,
    4. path: '/',
    5. agent: false // 仅为此一个请求创建一个新代理。
    6. }, (res) => {
    7. // 用响应做些事情。
    8. });