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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

慕桂英4014372 2019-11-25 10:29:21
我正在使用Node和Cheerio構(gòu)建網(wǎng)絡(luò)抓取工具,對(duì)于某個(gè)網(wǎng)站,我遇到以下錯(cuò)誤(它僅在該網(wǎng)站上發(fā)生,沒有其他我嘗試抓取的錯(cuò)誤。每次都在不同的位置發(fā)生,所以有時(shí)url x是引發(fā)錯(cuò)誤,有時(shí)url x是,并且完全是另一個(gè)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)調(diào)試起來非常棘手,我真的不知道從哪里開始。首先,什么是套接字掛起錯(cuò)誤?是404錯(cuò)誤還是類似錯(cuò)誤?還是僅表示服務(wù)器拒絕連接?我在任何地方都找不到這種解釋!編輯:這是(有時(shí))返回錯(cuò)誤的代碼示例: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    });}沒有直接調(diào)用來關(guān)閉連接,但是我正在使用Node Request(據(jù)我所知)使用的連接,http.get因此這不是必需的,如果我錯(cuò)了,請(qǐng)糾正我!編輯2:這是導(dǎo)致錯(cuò)誤的實(shí)際使用中的代碼。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貢獻(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ù)器也許停止了昂貴的操作。


查看完整回答
反對(duì) 回復(fù) 2019-11-25
?
12345678_0001

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


分享編輯


查看完整回答
反對(duì) 回復(fù) 2019-11-25
  • 3 回答
  • 0 關(guān)注
  • 656 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)