Javascript 如何处理第三方Node.js库中的断言错误
我使用Node.js请求模块请求如下Javascript 如何处理第三方Node.js库中的断言错误,javascript,node.js,httprequest,Javascript,Node.js,Httprequest,我使用Node.js请求模块请求如下 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%的
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%的情况下这是可行的,但有时我使用的代理会出现问题,这会导致一些奇怪的行为。我的代码将很好地运行,直到它突然停止并出现以下堆栈跟踪:
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)
现在,我希望回调中会返回任何错误。但这并没有发生,所以我无法在那里妥善处理
我试着在try/catch块中围绕它,如下所示:
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);
}
但这也不起作用——我仍然得到断言错误,程序停止
所以,我的问题是:我如何优雅地处理这个问题?如果遇到此断言错误,我希望取消(或忽略)请求并继续执行另一个请求,而不是让我的程序崩溃停止。这可能是处理这些不受欢迎的断言的唯一方法:
process.on('uncaughtException', err => {
if (err.name === 'AssertionError') {
// handle the assertion here or just ignore it..
}
});
您可能需要编辑库来修复它或控制条件,以便它永远不会命中该断言。在异步回调中抛出(自动包装在try/catch中的承诺除外)是不好的行为,因为它不能被更高级别的代码捕获。你可以通过重新定义他们在模块中使用的断言函数来解决这个问题,而不必涉及代码。。我同意上面jfriend00的观点,解决这个问题的唯一好方法就是实际修复库代码并优雅地处理它。我更改了tunnel agent中的代码以返回错误,而不是执行此断言。