2017-02-22 4 views
0

Ich bin mit der Node.js Anforderungsmodul Anfrage wie soWie Behauptung Fehler in Dritten Node.js Bibliotheken

let request = require('request'); 
request(SOME_URL, { proxy }, function (error, response, body) { 
    if (error) { 
     console.log('Error: ' + error); 
     return; 
    } 
    // my actual code here that usually runs 
}); 

98% der Zeit, dies funktioniert, aber manchmal benutze ich einen Proxy behandeln, agiert, was ein seltsames Verhalten verursacht. Mein Code entlang fein sein Brummen wird, bis er mit dem folgenden Stack-Trace zu einem abrupten Stillstand kommt:

assert.js:85 
    throw new assert.AssertionError({ 
^

AssertionError: 542 == 0 
    at ClientRequest.onConnect (/home/stephen/apps/my-cool-app/node_modules/tunnel-agent/index.js:159:14) 
    at ClientRequest.g (events.js:291:16) 
    at emitThree (events.js:116:13) 
    at ClientRequest.emit (events.js:194:7) 
    at Socket.socketOnData (_http_client.js:395:11) 
    at emitOne (events.js:96:13) 
    at Socket.emit (events.js:188:7) 
    at readableAddChunk (_stream_readable.js:176:18) 
    at Socket.Readable.push (_stream_readable.js:134:10) 
    at TCP.onread (net.js:548:20) 

Nun habe ich solche Fehler erwartete in dem Rückruf zurückgegeben werden. Aber das passiert nicht, also kann ich dort nicht richtig damit umgehen.

Ich habe versucht, dies in einem try/catch-Block umgeben, wie die folgenden:

try { 
    request(SOME_URL, { proxy }, function (error, response, body) { 
     if (error) { 
      console.log('Error: ' + error); 
      return; 
     } 
     // my actual code here that usually runs 
    }); 
} catch (err) { 
    console.log('Caught error: ' + err); 
} 

Aber das funktioniert auch nicht - ich immer noch die AssertionError und mein Programm stoppt.

Also, meine Frage ist: Wie gehe ich das anmutig? Wenn ich diese AssertionError begegne, möchte ich die Anfrage abbrechen (oder ignorieren) und mit einer anderen fortfahren, damit mein Programm nicht zum Stillstand kommt. Diese

+0

Sie werden wahrscheinlich die Bibliothek bearbeiten müssen, um es zu beheben oder die Bedingungen, so dass es nie diese Behauptung trifft. Es ist ein schlechtes Verhalten, in einen asynchronen Rückruf zu gelangen (außer für Versprechen, die automatisch in try/catch eingepackt werden), weil sie nicht vom höheren Code abgefangen werden können. Sie könnten wahrscheinlich damit umgehen, indem Sie die Assert-Funktion, die sie in ihrem Modul verwenden, neu definieren und den Code nicht anderweitig berühren. – jfriend00

+0

Ich hatte genau das gleiche Problem, das Sie kennen gelernt haben .. Ich stimme mit jfriend00 darüber überein, dass die einzige gute Möglichkeit, dieses Problem zu beheben, darin besteht, den Bibliothekscode tatsächlich zu reparieren und dies elegant zu handhaben. Ich habe den Code in tunnel-agent geändert, um einen Fehler zurückzugeben, anstatt diese Assertion auszuführen. –

Antwort

0

ist wahrscheinlich der einzige Weg, um diese unwillkommenen Behauptungen zu handhaben:

process.on('uncaughtException', err => { 

    if (err.name === 'AssertionError') { 
     // handle the assertion here or just ignore it.. 

    } 


});