【发布时间】:2026-01-14 08:40:01
【问题描述】:
我需要一些帮助来阻止节点抛出此错误,或者至少了解为什么我似乎无法捕捉到它:
events.js:72
throw er; // Unhandled 'error' event
^
Error: socket hang up
at SecurePair.error (tls.js:999:23)
at EncryptedStream.CryptoStream._done (tls.js:695:22)
at CleartextStream.read [as _read] (tls.js:496:24)
at CleartextStream.Readable.read (_stream_readable.js:320:10)
at EncryptedStream.onCryptoStreamFinish (tls.js:301:47)
at EncryptedStream.g (events.js:175:14)
at EncryptedStream.EventEmitter.emit (events.js:117:20)
at finishMaybe (_stream_writable.js:354:12)
at endWritable (_stream_writable.js:361:3)
at EncryptedStream.Writable.end (_stream_writable.js:339:5)
at EncryptedStream.CryptoStream.end (tls.js:633:31)
at Socket.onend (_stream_readable.js:483:10)
这是导致错误的代码sn-p:
var req = https.request(options, function(res) {
res.setEncoding('utf8');
var buffer = '';
res.on('data', function(data) {
buffer += data;
});
res.on('end', function() {
try {
var json = JSON.parse(buffer);
} catch (err) {
return callback(err);
}
callback(null, json);
});
});
req.on('error', function(err) {
callback(err);
});
req.end(data);
api.prototype._get = function(action, callback, args) {
args = _.compactObject(args);
var path = '/api/' + action + '/?' + querystring.stringify(args);
this._request('get', path, undefined, callback, args)
}
api.prototype._post = function(action, callback, args) {
var path = '/api/' + action + '/';
args = _.compactObject(args);
var data = querystring.stringify(args);
this._request('post', path, data, callback, args);
}
为什么 req.on('error' 没有捕捉到这个错误?
节点版本:0.10.21
【问题讨论】:
-
套接字挂起是指您尝试联系的服务器永远不会结束连接,而是发生超时,并以“挂起”错误响应。您必须弄清楚为什么服务器没有关闭连接,或者如果请求花费的时间太长,您必须延长超时限制。你在最后调用
req.end(data),你的变量被称为req,所以应该在请求开始之前结束请求,因为请求是异步的,这似乎是一个错误,但没有足够的上下文来告诉你. -
您确定没有使用两次
req变量名吗? -
当我尝试联系的服务器暂时关闭时,可能会发生此错误。所以我正在发送一个基本的获取请求,当数据进入时,我会处理它。有时我正在连接的服务器发生故障,但这对我来说并不重要,因为我会每分钟重试一次。我只是想阻止错误被抛出。有没有办法让我捕捉到超时错误?
-
不,我没有使用 req 变量两次。此脚本也可以正常运行超过 24 小时,然后出现此错误。
-
好吧,这看起来有点奇怪,因为你在异步方法的回调中返回了
data,然后最后你输出了data,但实际上不应该有任何data在这一点上,因为它是异步的等。为避免错误,您可以将整个函数粘贴在 try / catch 块中,或者您可以(最好)使用 node.js domains抓住错误。
标签: javascript node.js https