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
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
Share
Improve this question
asked May 22, 2019 at 10:42
isflaviorisflavior
1402 gold badges4 silver badges9 bronze badges
4 Answers
Reset to default 6Set maxSockets
options like this:
const agent = new http.Agent({
keepAlive: true,
maxSockets: 1
});
By default maxSockets
is set to Infinity
- https://nodejs/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();
Starting with Node.js v19, the keepAlive
option is set to true by default for all outgoing HTTP(s)/1.1 connections.
You can read more about it on Node.js's v19 documentation.
The accepted answer doesn't make clear that the code posted will allow only one request simultaneously per host per thread.
That is usually not what you want and will lead to requests slowing down waiting for the previous one to plete.
your demo not set res1's on data
listener ,it will cause the socket not be close ,so the second request have to create a new connect to server ,just add a data
listener