【发布时间】:2017-02-22 21:06:59
【问题描述】:
我正在像这样使用 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% 的情况下都有效,但有时我使用的代理会起作用,这会导致一些奇怪的行为。我的代码会一直嗡嗡作响,直到突然停止并出现以下堆栈跟踪:
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);
}
但这也不起作用 - 我仍然收到 AssertionError 并且我的程序停止。
所以,我的问题是:我该如何优雅地处理这个问题?如果我遇到这个AssertionError 我想取消(或忽略)该请求并继续另一个请求,而不是让我的程序崩溃停止。
【问题讨论】:
-
您可能必须编辑库以修复它或控制条件,使其永远不会达到该断言。抛出异步回调是不好的行为(除了自动包装在 try/catch 中的承诺),因为它不能被更高级别的代码捕获。您可以通过重新定义他们在模块中使用的任何断言函数来解决它,而不是以其他方式触及代码。
-
我遇到了与您遇到的完全相同的问题。我同意上述 jfriend00 的观点,即解决此问题的唯一好方法是实际修复库代码并优雅地处理此问题。我已更改隧道代理中的代码以返回错误而不是执行此断言。
标签: javascript node.js httprequest