Я пытаюсь использовать http.Agent({ keepAlive: true})
на http.request
, чтобы сохранить соединение открытым для будущих запросов.
Я создал простой сервер для регистрации каждого нового подключения, но когда я запускаю свой запрос.js, сервер регистрирует два новых подключения.
Как я могу использовать поддержку активности HTTP с собственными модулями Node.js?
запрос.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.info("REQUEST_1");
var req2 = http.request({
agent: agent,
method: "GET",
hostname: "localhost",
port: 3000
}, function (res2) {
console.info("REQUEST_2");
});
req2.end();
});
req1.end();
сервер.js:
const http = require('http');
var server = http.createServer(function (req, res) {
res.end('OK');
console.info("REQUEST");
})
server.on('connection', function (socket) {
console.info("NEW CONNECTION");
})
server.listen(3000);
выход:
NEW CONNECTION
REQUEST
NEW CONNECTION
REQUEST
Установите параметры maxSockets
следующим образом:
const agent = new http.Agent({
keepAlive: true,
maxSockets: 1
});
По умолчанию maxSockets
установлен на Infinity
- https://nodejs.org/api/http.html#http_new_agent_options
Полный пример на узле 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.info("REQUEST_1");
res1.on('data', function () {
console.info("REQUEST_1 data");
});
res1.on('end', function () {
console.info("REQUEST_1 end");
});
var req2 = http.request({
agent: agent,
method: "GET",
hostname: "localhost",
port: 3000
}, function (res2) {
console.info("REQUEST_2");
res2.on('data', function () {
console.info("REQUEST_2 data");
});
res2.on('end', function () {
console.info("REQUEST_2 end");
});
});
req2.end();
});
req1.end();
Спасибо. Теперь он работает, я не обрабатывал события «данные» и «конец» запросов.
Почему это не работает без обработки (даже «нуп» в порядке) событий «данные» и «конец» запросов?
Объяснение здесь: nodejs.org/dist/latest-v10.x/docs/api/… , начинается с «Если обработчик ответа не добавлен». В этом случае вы можете опустить событие end
, но я добавил это, чтобы охватить все.
Принятый ответ не дает понять, что опубликованный код позволит одновременно запрашивать только один для каждого хоста в потоке.
Обычно это не то, что вам нужно, и это приведет к замедлению запросов в ожидании завершения предыдущего.
Я получил тот же результат, однако теперь "REQUEST_2" был задержан. Похоже, что второй запрос ожидает закрытия первого.