Search code examples
javascriptnode.jshttp

Node.js http.request keepAlive


I'm trying to use http.Agent({ keepAlive: true}) on http.request to keep the connection open for future requests.

I created a simple server to log each new connection but when i run my request.js the server logs two new connections.

How can i use the HTTP keep-alive with Node.js native modules?

request.js:

const http = require("http");

const agent = new http.Agent({
    keepAlive: true
});

var req1 = http.request({
    agent: agent,
    method: "GET",
    hostname: "localhost",
    port: 3000
}, function (res1) {
    console.log("REQUEST_1");

    var req2 = http.request({
        agent: agent,
        method: "GET",
        hostname: "localhost",
        port: 3000
    }, function (res2) {
        console.log("REQUEST_2");
    });

    req2.end();
});

req1.end();

server.js:

const http = require('http');

var server = http.createServer(function (req, res) {
    res.end('OK');
    console.log("REQUEST");
})

server.on('connection', function (socket) {
    console.log("NEW CONNECTION");
})

server.listen(3000);

output:

NEW CONNECTION
REQUEST
NEW CONNECTION
REQUEST

Solution

  • Set maxSockets options like this:

    const agent = new http.Agent({
        keepAlive: true,
        maxSockets: 1
    });
    

    By default maxSockets is set to Infinity - https://nodejs.org/api/http.html#http_new_agent_options

    Full example on node v10

    const http = require("http");
    
    const agent = new http.Agent({
        keepAlive: true,
        maxSockets: 1
    });
    
    var req1 = http.request({
        agent: agent,
        method: "GET",
        hostname: "localhost",
        port: 3000
    }, function (res1) {
        console.log("REQUEST_1");
    
        res1.on('data', function () {
            console.log("REQUEST_1 data");
        });
    
        res1.on('end', function () {
            console.log("REQUEST_1 end");
        });
    
        var req2 = http.request({
            agent: agent,
            method: "GET",
            hostname: "localhost",
            port: 3000
        }, function (res2) {
            console.log("REQUEST_2");
    
            res2.on('data', function () {
                console.log("REQUEST_2 data");
            });
    
            res2.on('end', function () {
                console.log("REQUEST_2 end");
            });
        });
        req2.end();
    });
    req1.end();