[英]Node.js http.request keepAlive
我正在嘗試在 http.request 上使用http.request
http.Agent({ keepAlive: true})
來為將來的請求保持連接打開。
我創建了一個簡單的服務器來記錄每個新連接,但是當我運行我的request.js時,服務器會記錄兩個新連接。
如何將 HTTP keep-alive 與 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.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();
服務器.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
像這樣設置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.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();
接受的答案並沒有明確表示發布的代碼將只允許每個主機每個線程同時發出一個請求。
這通常不是您想要的,並且會導致請求變慢,等待前一個完成。
從 Node.js v19 開始,所有傳出 HTTP(s) 連接的keepAlive
選項默認設置為 true。
您可以在Node.js 的 v19 文檔上閱讀更多相關信息。
你的演示沒有在data
監聽器上設置res1,它會導致套接字不關閉,所以第二個請求必須創建一個新的連接到服務器,只需添加一個data
監聽器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.