Node.js 与Superagent保持连接

Node.js 与Superagent保持连接,node.js,http,keep-alive,superagent,Node.js,Http,Keep Alive,Superagent,我正在运行node.js服务器a,它使用superagent向另一个服务器B发出HTTP请求 我调查了服务器B上的请求,发现头连接为关闭,而httpVersion为1.1: var http = require('http'); var request = require('superagent'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); r

我正在运行node.js服务器a,它使用superagent向另一个服务器B发出HTTP请求

我调查了服务器B上的请求,发现头
连接
关闭
,而httpVersion为
1.1

var http = require('http');
var request = require('superagent');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('req.httpVersion seen on server:' + req.httpVersion);
  res.write('\nreq.headers.connection seen on server:' + req.headers.connection);
  res.end();
}).listen(1337, '0.0.0.0');

request
  .get('localhost:1337/helloword')
  .end(function (err, res) {
    console.log(res.text);
  });
这导致:

req.httpVersion seen on server:1.1
req.headers.connection seen on server:close
但是,如果我从浏览器访问同一服务器,我会得到:

req.httpVersion seen on server:1.1
req.headers.connection seen on server:keep-alive
从中我了解到,HTTP 1.1的默认设置是
keep-alive
,除非使用
Connection:close
另行声明

因此,我的问题是:

  • 为什么Superagent/Node.js显式地将请求设置为不使用保持活动/持久连接
  • 如何强制Superagent/Node.js使用保持活动的连接
  • 我如何进一步影响具体行为(有多少连接保持打开、超时等)

浏览器可以重用套接字句柄,因此它会将头
连接:keep alive
发送到服务器

如果要保持连接的活动状态,可以按如下方式发送该标头:

request
.get('localhost:1337/helloword')
.set('Connection', 'keep-alive')
.end(function (err, res) {
   console.log(res.text);
});

它似乎没有文档记录,但您可以通过函数
agent
将http代理传递给superagent。 因此,您可以使用这个模块创建一个keep-alive代理:并将其传递给superagent

大概是这样的:

request
.get('localhost:1337/helloword')
.set('Connection', 'keep-alive')
.end(function (err, res) {
   console.log(res.text);
});
util=require('util');
util.debuglog=require('debuglog');
var http=require('http');
var请求=要求(“超级代理”);
var Agent=require('agentkeepalive');
var keepaliveAgent=新代理({
maxSockets:100,
maxFreeSockets:10,
超时:60000,
keepAliveTimeout:30000//空闲套接字保持30秒
});
http.createServer(函数(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.write('req.httpVersion出现在服务器上:'+req.httpVersion);
res.write('\nreq.headers.connection出现在服务器上:'+req.headers.connection);
res.end();
}).听(1337,“0.0.0.0”);
要求
.get('localhost:1337/helloword')
.代理(keepaliveAgent)
.end(函数(err、res){
console.log(res.text);
});

用于superagent。也可以使用超时(5000)。

                    await superagent.get(`${anyurl}`, { rejectUnauthorized: false })
                        .set({ "Accept": "application/json", "Content-Type": "application/json", })
                        .auth(username, password, { "type": "auto" })
                        .timeout(1000)

嗯,这真的足够吗?接收端“服务器B”可以并将其作为保持活动连接处理。但我怀疑在请求方“服务器A”这是否足够。在我看来,“服务器A”仍然会在每次请求时打开一个新连接。我还不知道如何证明这一点。我不知道。但是superagent依赖于
node.js http
,并且
node.js http
支持保持活动状态以重用套接字@dknaus当你这样尝试时会发生什么?结果如何?