我正在使用node-libcurl。我有一个小模块,我有一个curl请求队列。以下是实际发出curl请求的函数:
const Curl = require('node-libcurl').Curl;
let timeoutCount = 0;
function _getOData(url) {
const curl = new Curl();
return new Promise((resolve, reject) => {
curl.setOpt(Curl.option.URL, url);
curl.setOpt(Curl.option.HTTPAUTH, Curl.auth.NTLM);
curl.setOpt(Curl.option.SSL_VERIFYPEER, false);
curl.setOpt(Curl.option.SSL_VERIFYHOST, false);
curl.setOpt(Curl.option.POST, 0);
curl.setOpt(Curl.option.HTTPHEADER, ['Accept: application/json']);
let done = false;
curl.on('end', function (statusCode, body, headers) {
done = true;
const retObj = JSON.parse(body);
resolve(retObj);
curl.close();
});
curl.on('error', function (e) {
done = true;
reject(e);
curl.close();
});
curl.perform();
setTimeout(() => {
if (!done) {
timeoutCount++;
reject(new Error(`request timed out: ${timeoutCount}`));
}
},1000*10);
})
}
我一直在控制台中收到此错误:(node:26616) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 6): Error: request timed out
- 所以我添加了timeoutCount,因为我确定我正在捕获所有Promise错误,尽管收到此警告。
对_getOData函数的每次调用都发生在队列逻辑中,特别是这段代码是调用_getOData的唯一代码:
const p = _getOData(nextObj.url);
p.then(nextObj.cb);
p.catch((e) => {
if (e.message.includes("request timed out")) {
queue.add(nextObj.url, nextObj.cb, nextObj.ecb);
return true;
} else {
nextObj.ecb(e);
return false;
}
});
所以我在e.message.includes("request timed out")
之后设置了一个断点,并且每次请求超时错误都会在那里发生,所以我知道没有未处理的拒绝承诺#39;每一个承诺拒绝都会通过这个捕获。我检查变量是否在那里突破以确保timeoutCount存在,并且它始终是,然后它仍然总是作为未处理的承诺拒绝记录到控制台。
这里发生了什么?
答案 0 :(得分:2)
您可能正在捕获队列中的拒绝而不是堆栈上的拒绝。您可以使用以下代码获得该错误(警告):
~/.ssh/authorized_keys
如果要捕获队列中的拒绝,则可以执行以下操作:
SELECT * FROM users WHERE DATE(date) BETWEEN '2016-10-12' AND '2017-10-12'
有关队列和堆栈的信息可以找到here。