在节点中,在循环中发送HTTP请求(例如0 - 10000),将错误引发为:Socket挂断

时间:2014-03-07 12:58:11

标签: node.js http

代码座右铭:要检查redis pub / sub性能,我试图在node.js中循环发出http请求。

问题:假设我的循环范围从0到10000,当我运行节点时,它将循环发送post请求。它按预期工作到120秒。在Socket挂起后,该节点抛出错误。检查解决方案时,我发现该节点的默认套接字超时为2分钟。

问题: 1.问题是否会通过更改默认超时来解决? 2.如果是这样,我们如何更改默认值。 3.除了更改套接字超时值之外,还有其他方法可用于解决此问题吗?

代码

var clientNo = 100000,a=0;
var express = require('express'),
app = express(),
http = require('http'),
server = http.createServer(app);
http.globalAgent.maxSockets = Infinity;
app.enable('trust proxy'); 
app.disable( 'x-powered-by' ); 
app.use(express.bodyParser());
app.use(app.router);
app.set('port', 6002);

server.listen(app.get('port')); 
var postint= setInterval(function(){
makeSubscription(a,function(query){
var options = {
        path:query,
        port: '6001',
    method: 'POST'
};

var req = http.request(options, function(response){                 
      response.on('end', function () {
          console.log("Ends");
      });
   });
   req.on('error', function (e) {
       console.log(e);          
   });              
       req.end();
    });
a++;
if(a == clientNo)
{
   clearInterval(postint);
}
},1);

注意:我发送另一个帖子请求到不同路径上的同一端口,时间为1秒setTimeout。

3 个答案:

答案 0 :(得分:0)

问题可能不在于超时,而是responsesimply sitting idle throughout the duration

  

请注意,end事件不会触发,除非数据已完全耗尽。这可以通过切换到流动模式,或通过反复调用read()直到你结束来完成。

这是因为节点0.10及更高版本中的Streams don't automatically stream anything

  

在您指示您已准备好接收数据之前,可读流将不会开始发送数据。

启动它有三个选项:

  1. 使用'data'设置流动模式:

    response.on('data', function (chunk) {
        console.log(data.toString());
    });
    response.on('end', function () {
        console.log('End');
    });
    
  2. 使用'readable'.read()设置非流动模式:

    response.on('readable', function () {
        var chunk;
        while (chunk = response.read()) {
            console.log(chunk.toString());
        }
    });
    response.on('end', function () {
        console.log('End');
    });
    
  3. 明确地告诉.resume()

    response.resume();
    response.on('end', function () {
        console.log('End');
    });
    

答案 1 :(得分:0)

您是否从服务器发送有效回复?错误“socket hangup”看起来像是等待响应的超时。请检查您的服务器代码或尝试从Postman等其他客户端发帖,并确保您收到回复。

答案 2 :(得分:0)

代码可以简单地编写,以完成相同的工作。

var a=0,clientNo = 10;
var http=require('http');
var sub = setInterval(function(){
  var temp = '/?channel=channel'+a;
  var options = {
  host:'127.0.0.1',
  port:'6001',
  path:temp,
  method:'POST'
  };
  a++;
  var req = http.request(options,function(res){
  res.on('data', function(chunk) {
           console.log('data');
  });
  res.on('error', function(err) {
        console.log(err);
  });
  res.on('end', function() {
       console.log('end');
  });
 });
 req.on('error',function(err){
    console.log(Date());
 });
 req.end();
 if(a== clientNo)
 {
    clearInterval(sub);
 }
},1);

也可以同样的方式发送更多请求。