3 回答

TA貢獻1873條經驗 獲得超9個贊
有兩種情況socket hang up會被拋出:
當您是客戶時
當您作為客戶端時,將請求發(fā)送到遠程服務器,并且不會及時收到響應。您的套接字已結束,將引發(fā)此錯誤。您應該捕獲此錯誤并決定如何處理:是否重試該請求,將其排隊以備后用,等等。
當您是服務器/代理
當您作為服務器(也許是代理服務器)從客戶端接收請求,然后開始對其執(zhí)行操作(或將請求中繼到上游服務器)時,在準備響應之前,客戶端決定取消/中止操作請求。
此堆棧跟蹤顯示了客戶端取消請求時發(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上面提到的內容,尤其是:
// 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;
}
如果客戶端是瀏覽器中的用戶,這是一種典型情況。加載某些資源/頁面的請求需要很長時間,并且用戶只需刷新頁面即可。這樣的操作會使先前的請求中止,從而在服務器端拋出此錯誤。
由于此錯誤是由客戶的意愿引起的,因此他們不希望收到任何錯誤消息。因此,無需將此錯誤視為嚴重錯誤。只是忽略它。由于這樣的事實,這鼓勵了res您的客戶端偵聽的套接字,盡管該套接字仍可寫,但仍可寫。
console.log(res.socket.destroyed); //true
因此,除了顯式關閉響應對象之外,沒有任何發(fā)送任何內容的方法:
res.end();
但是,如果您是已經將請求中繼到上游的代理服務器,您應該確定要中止內部請求到上游,這表明您對響應不感興趣,這反過來會告訴上游服務器也許停止了昂貴的操作。

TA貢獻1878條經驗 獲得超4個贊
看一下來源:
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;
}
}
服務器從不發(fā)送響應時,將發(fā)出此消息。
- 3 回答
- 0 關注
- 669 瀏覽
添加回答
舉報