javascript Node.js http.请求保持活动

jckbn6z7  于 2022-12-25  发布在  Java
关注(0)|答案(3)|浏览(174)

我尝试在http.request上使用http.Agent({ keepAlive: true})来保持连接为将来的请求打开。
我创建了一个简单的服务器来记录每个新连接,但是当我运行我的 * request.js * 时,服务器记录了两个新连接。
我如何使用HTTP keep-alive与Node.js原生模块?
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);

输出:

NEW CONNECTION
REQUEST
NEW CONNECTION
REQUEST
wnavrhmk

wnavrhmk1#

按如下方式设置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();
gajydyqb

gajydyqb2#

可接受的答案并没有明确说明发布的代码将只允许每个主机每个线程同时 * 一个 * 请求。
这通常不是您想要的,并且将导致请求变慢,等待前一个请求完成。

xcitsw88

xcitsw883#

从Node.js v19开始,keepAlive选项对于所有传出HTTP连接默认设置为true。
您可以在Node.js的v19文档中阅读更多相关信息。

相关问题