节点发出UnhandledPromiseRejection警告,当我确定*我抓住拒绝时

时间:2017-12-21 09:41:35

标签: javascript node.js promise

我正在使用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存在,并且它始终是,然后它仍然总是作为未处理的承诺拒绝记录到控制台。

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

您可能正在捕获队列中的拒绝而不是堆栈上的拒绝。您可以使用以下代码获得该错误(警告):

~/.ssh/authorized_keys

如果要捕获队列中的拒绝,则可以执行以下操作:

SELECT * FROM users WHERE DATE(date) BETWEEN '2016-10-12' AND '2017-10-12'

有关队列和堆栈的信息可以找到here