求大神揭开谜底!unhandled exception:Error: accept EMFILE
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 代码有问题么? 帮我看看代码。。