簡體   English   中英

Node.js http.請求保活

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM