求大神揭开谜底!unhandled exception:Error: accept EMFILE
发布于 11 年前 作者 songbo 7603 次浏览 最后一次编辑是 8 年前

node.js使用http.request请求别的服务器数据时,有时会报错err:socket hands up ! 当socket hands up 过多时又会报错: unhandled exception:Error: accept EMFILE at errnoException (net.js:769:11) at TCP.onconnection (net.js:1017:24) 直接导致程序必须重启。 求解!设置请求超时时间的时候,当请求超时时候调用abort()或者destroy()释放还是会报错err:socket hands up ! socket hands up是什么原因? 具体代码如下: function(req, res) {

  transtr='*******';
  var options = {
        host : 'xxxxxxxxxxxx',
        port : 80,
        path : '/ajax/requestHead.do',
        data : transtr,
        method : 'POST',
        headers : {
           'Content-Type' : 'application/x-www-form-urlencoded',
           'Content-Length' : transtr.length,
           'Connection':'close'
         }
      };
      console.log(transtr+'----------------------------------------');
      var request_timer = null, serareq = null;

  var serareq = http.request(options, function(serares) {
       var heads = serares.headers;
       serares.setEncoding('utf8');
      clearTimeout(request_timer);

    // 等待响应60秒超时
     var response_timer = setTimeout(function() {
         serares.destroy();
         console.log('Response Timeout.');
      }, 60000);
      console.log("Got response: " + res.statusCode);
      var resData= '';

     serares.on('data', function (respData) {
         resData += respData;
     });

     serares.on('end', function () {
        clearTimeout(response_timer);
        log.logger.info('=======rData============================')
        res.send(resData);
    });
 });
 serareq.on("timeout", function() {
       //res.send('');
        log.logger.info("timeout received");
        if (serareq.serares) {
            serareq.serares.emit("abort");
        }
        serareq.abort();
  });
 //设置请求超时时间5秒
request_timer = setTimeout(function() {
  //serareq.abort();
   serareq.emit("timeout",{message:'have been timeout...'});
    log.logger.info('=====Request Timeout.=================');
 }, 5000);
log.logger.info("Send packageData!!!!!!!!!!!!!!!!");
// write data to request body
serareq.write(transtr);
serareq.end();

}

8 回复

求解啊

open file 數量達上限 默認是1024 你用 ulimit -a看看

// 等待响应60秒超时
     var response_timer = setTimeout(function() {
         serares.destroy();
         console.log('Response Timeout.');
      }, 60000);

这个不应该放在回调里吧。

求解啊…socket hand up是什么原因

有一种情况是response end了之后,继续写入内容

关键socket hand up是什么原因 代码没写错吧?

这个是设置响应超时…是应该放在回调里面的…请求超时和响应超时都写了…

@perterpon 代码有问题么? 帮我看看代码。。

回到顶部