3 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
有兩種情況socket hang up會(huì)被拋出:
當(dāng)您是客戶時(shí)
當(dāng)您作為客戶端時(shí),將請(qǐng)求發(fā)送到遠(yuǎn)程服務(wù)器,并且不會(huì)及時(shí)收到響應(yīng)。您的套接字已結(jié)束,將引發(fā)此錯(cuò)誤。您應(yīng)該捕獲此錯(cuò)誤并決定如何處理:是否重試該請(qǐng)求,將其排隊(duì)以備后用,等等。
當(dāng)您是服務(wù)器/代理
當(dāng)您作為服務(wù)器(也許是代理服務(wù)器)從客戶端接收請(qǐng)求,然后開始對(duì)其執(zhí)行操作(或?qū)⒄?qǐng)求中繼到上游服務(wù)器)時(shí),在準(zhǔn)備響應(yīng)之前,客戶端決定取消/中止操作請(qǐng)求。
此堆棧跟蹤顯示了客戶端取消請(qǐng)求時(shí)發(fā)生的情況。
Trace: { [Error: socket hang up] code: 'ECONNRESET' }
at ClientRequest.proxyError (your_server_code_error_handler.js:137:15)
at ClientRequest.emit (events.js:117:20)
at Socket.socketCloseListener (http.js:1526:9)
at Socket.emit (events.js:95:17)
at TCP.close (net.js:465:12)
行http.js:1526:9指向socketCloseListener@Blender上面提到的內(nèi)容,尤其是:
// This socket error fired before we started to
// receive a response. The error needs to
// fire on the request.
req.emit('error', createHangUpError());
...
function createHangUpError() {
var error = new Error('socket hang up');
error.code = 'ECONNRESET';
return error;
}
如果客戶端是瀏覽器中的用戶,這是一種典型情況。加載某些資源/頁面的請(qǐng)求需要很長(zhǎng)時(shí)間,并且用戶只需刷新頁面即可。這樣的操作會(huì)使先前的請(qǐng)求中止,從而在服務(wù)器端拋出此錯(cuò)誤。
由于此錯(cuò)誤是由客戶的意愿引起的,因此他們不希望收到任何錯(cuò)誤消息。因此,無需將此錯(cuò)誤視為嚴(yán)重錯(cuò)誤。只是忽略它。由于這樣的事實(shí),這鼓勵(lì)了res您的客戶端偵聽的套接字,盡管該套接字仍可寫,但仍可寫。
console.log(res.socket.destroyed); //true
因此,除了顯式關(guān)閉響應(yīng)對(duì)象之外,沒有任何發(fā)送任何內(nèi)容的方法:
res.end();
但是,如果您是已經(jīng)將請(qǐng)求中繼到上游的代理服務(wù)器,您應(yīng)該確定要中止內(nèi)部請(qǐng)求到上游,這表明您對(duì)響應(yīng)不感興趣,這反過來會(huì)告訴上游服務(wù)器也許停止了昂貴的操作。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
看一下來源:
function socketCloseListener() {
var socket = this;
var parser = socket.parser;
var req = socket._httpMessage;
debug('HTTP socket close');
req.emit('close');
if (req.res && req.res.readable) {
// Socket closed before we emitted 'end' below.
req.res.emit('aborted');
var res = req.res;
res.on('end', function() {
res.emit('close');
});
res.push(null);
} else if (!req.res && !req._hadError) {
// This socket error fired before we started to
// receive a response. The error needs to
// fire on the request.
req.emit('error', createHangUpError());
req._hadError = true;
}
}
服務(wù)器從不發(fā)送響應(yīng)時(shí),將發(fā)出此消息。
分享編輯
- 3 回答
- 0 關(guān)注
- 656 瀏覽
添加回答
舉報(bào)