Javascript 为什么我不能发送5个请求';不监听数据事件?
我发现一些问题似乎与这个问题有关(例如:),但我仍然无法理解细节 以下是我的情况 首先,服务器代码:Javascript 为什么我不能发送5个请求';不监听数据事件?,javascript,node.js,http,Javascript,Node.js,Http,我发现一些问题似乎与这个问题有关(例如:),但我仍然无法理解细节 以下是我的情况 首先,服务器代码: var express = require ('express'), methodOverride = require('method-override'); var app = express(); app.use(methodOverride()); app.use(function(err, req, res, next) { console.error(err.sta
var express = require ('express'),
methodOverride = require('method-override');
var app = express();
app.use(methodOverride());
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500);
res.send({ error: err });
});
app.use('/', function(req, res, next) {
res.header('Cache-control', 'no-cache');
res.header('Access-Control-Allow-Origin', '*');
next();
});
app.get('/OK/', function (req, res) {
console.log(getTimestamp() + ' OK ');
res.status(200).send("200");
});
app.listen(22222);
function getTimestamp(){
var timestamp = new Date();
return timestamp.toString() + " " + timestamp.getMilliseconds();
}
console.log(getTimestamp() + ' Sever started!');
app.use('/', function(req, res, next) {
res.header('Cache-control', 'no-cache');
res.header('Access-Control-Allow-Origin', '*');
res.header('connection', 'close'); /* add a header about connection */
next();
});
然后,客户端的代码:
var http = require('http');
var opt = {
method: "GET",
host: "localhost",
port: 22222,
path: "/OK/",
headers: {
'Cache-control': 'no-cache'
}
};
count = 10;
function request(){
var req = http.request(opt, function (serverFeedback) {
var body = "";
serverFeedback
.on('data',function(){})
.on('end', function () {
console.log(getTimestamp(), "response END", serverFeedback.statusCode, body);
});
});
req.end();
console.log(getTimestamp(), "resuest START");
count--;
if(count > 0){
setTimeout(request, 500);
}
}
request();
function getTimestamp(){
var timestamp = new Date();
return timestamp.toString() + " " + timestamp.getMilliseconds();
}
在node中运行这两个节点,当然首先运行服务器,客户端将在大约5s内发送10个请求,一切正常。这样地:
但是,如果我删除有关在客户端中侦听“数据”事件的代码,如下所示:
var req = http.request(opt, function (serverFeedback) {
var body = "";
serverFeedback
//.on('data',function(){}) /* remove the listener*/
.on('end', function () {
console.log(getTimestamp(), "response END", serverFeedback.statusCode, body);
});
});
再次运行,客户端似乎在5秒内发送了10个请求,但实际上服务器只收到了5个请求:
正如你所见,“结束”事件似乎没有被触发
最后,我通过服务器代码在响应中添加了一个头:
var express = require ('express'),
methodOverride = require('method-override');
var app = express();
app.use(methodOverride());
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500);
res.send({ error: err });
});
app.use('/', function(req, res, next) {
res.header('Cache-control', 'no-cache');
res.header('Access-Control-Allow-Origin', '*');
next();
});
app.get('/OK/', function (req, res) {
console.log(getTimestamp() + ' OK ');
res.status(200).send("200");
});
app.listen(22222);
function getTimestamp(){
var timestamp = new Date();
return timestamp.toString() + " " + timestamp.getMilliseconds();
}
console.log(getTimestamp() + ' Sever started!');
app.use('/', function(req, res, next) {
res.header('Cache-control', 'no-cache');
res.header('Access-Control-Allow-Origin', '*');
res.header('connection', 'close'); /* add a header about connection */
next();
});
重新启动服务器并再次运行客户端:
现在服务器可以立即收到所有10个请求,但是“end”事件似乎仍然没有触发
因此,“数据”事件上的侦听器似乎对http连接产生了一些影响
有人能为大家解释一下细节吗?发生了两件事 首先,当您不“侦听数据事件”时,响应流永远不会完成,因此您发出的http请求永远不会完成。这本质上是一个漏洞始终消耗您的流否则,您的流将无限期地处于“暂停”状态
第二个是node.js默认使用默认代理池连接。现在,它将5个连接集在一起,这就是为什么您会看到5个连接的限制。我知道nodejs只将5个连接集在一起,但是如果我监听了“data”事件,并将响应头“connection”值设置为“keep alive”,服务器可以立即收到所有10个请求。这是否意味着保持连接,或者不仅侦听“数据”事件的依赖项,而且独立于响应中的“连接”头?您说过,如果没有“数据”事件的侦听器,http请求永远不会完成,这本质上是一个泄漏。你能为你的意见提供一些依据吗?非常感谢您的回复!