第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

NodeJS-“套接字掛起”實際上是什么意思?

NodeJS-“套接字掛起”實際上是什么意思?

飲歌長嘯 2019-12-10 10:58:42
我正在使用Node和Cheerio構建網絡抓取工具,對于某個網站,我遇到以下錯誤(它僅在該網站上發(fā)生,沒有其他我嘗試抓取的錯誤。每次都在不同的位置發(fā)生,所以有時url x是引發(fā)錯誤,有時url x是,并且完全是另一個URL:    Error!: Error: socket hang up using [insert random URL, it's different every time]Error: socket hang up    at createHangUpError (http.js:1445:15)    at Socket.socketOnEnd [as onend] (http.js:1541:23)    at Socket.g (events.js:175:14)    at Socket.EventEmitter.emit (events.js:117:20)    at _stream_readable.js:910:16    at process._tickCallback (node.js:415:13)調試起來非常棘手,我真的不知道從哪里開始。首先,什么是套接字掛起錯誤?是404錯誤還是類似錯誤?還是僅表示服務器拒絕連接?我在任何地方都找不到這種解釋!編輯:這是(有時)返回錯誤的代碼示例:function scrapeNexts(url, oncomplete) {    request(url, function(err, resp, body) {        if (err) {            console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);            errors.nexts.push(url);        }        $ = cheerio.load(body);        // do stuff with the '$' cheerio content here    });}沒有直接調用來關閉連接,但是我正在使用Node Request(據(jù)我所知)使用的連接,http.get因此這不是必需的,如果我錯了,請糾正我!編輯2:這是導致錯誤的實際使用中的代碼。prodURL其他變量主要是前面定義的jquery選擇器。這將async庫用于Node。function scrapeNexts(url, oncomplete) {    request(url, function (err, resp, body) {        if (err) {            console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);            errors.nexts.push(url);        }        async.series([                function (callback) {                    $ = cheerio.load(body);                    callback();                },                function (callback) {                    $(prodURL).each(function () {                        var theHref = $(this).attr('href');                        urls.push(baseURL + theHref);                    });                    var next = $(next_select).first().attr('href');                    oncomplete(next);                }            ]);    });}
查看完整描述

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();

但是,如果您是已經將請求中繼到上游的代理服務器,您應該確定要中止內部請求到上游,這表明您對響應不感興趣,這反過來會告訴上游服務器也許停止了昂貴的操作。


查看完整回答
反對 回復 2019-12-10
?
UYOU

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ā)出此消息。


查看完整回答
反對 回復 2019-12-10
  • 3 回答
  • 0 關注
  • 669 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號