Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在节点中,在循环中发布HTTP请求(比如0-10000),抛出错误为:套接字挂起_Node.js_Http - Fatal编程技术网

Node.js 在节点中,在循环中发布HTTP请求(比如0-10000),抛出错误为:套接字挂起

Node.js 在节点中,在循环中发布HTTP请求(比如0-10000),抛出错误为:套接字挂起,node.js,http,Node.js,Http,代码座右铭:为了检查redis发布/订阅性能,我尝试在node.js的循环中发出http请求 问题是:假设我的循环范围为0到10000,当我运行节点时,它将在循环中发送post请求。它可以正常工作到预期的120秒。当套接字挂起时,该节点抛出错误。在检查解决方案时,我发现节点的默认套接字超时为2分钟 问题是: 1.是否可以通过更改默认超时来解决此问题? 2.如果是,我们如何更改默认值。? 3.除了更改套接字超时值之外,还有其他方法可以解决此问题吗 代码为: var clientNo = 10000

代码座右铭:为了检查redis发布/订阅性能,我尝试在node.js的循环中发出http请求

问题是:假设我的循环范围为0到10000,当我运行节点时,它将在循环中发送post请求。它可以正常工作到预期的120秒。当套接字挂起时,该节点抛出错误。在检查解决方案时,我发现节点的默认套接字超时为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秒设置超时向不同路径上的同一端口发送另一个post请求。

严格来说,问题可能不在于超时,而在于
响应
是错误的

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

这是因为节点0.10及更高版本中存在流

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

有3个选项可以启动它:

  • 使用以下选项设置流动模式:

  • 使用和设置非流动模式:

  • 不管怎样,明确地告诉它:


  • 您是否正在从服务器发送有效响应?“套接字挂起”错误看起来像是等待响应的超时。请检查您的服务器代码或尝试从rest客户端发布,并确保您得到响应。

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

    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);
    

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

    谢谢@Skanda。从服务器发送回客户端的响应丢失。这个错误被修正了。
    response.on('readable', function () {
        var chunk;
        while (chunk = response.read()) {
            console.log(chunk.toString());
        }
    });
    response.on('end', function () {
        console.log('End');
    });
    
    response.resume();
    response.on('end', function () {
        console.log('End');
    });
    
    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);