当前位置: 首页 > 知识库问答 >
问题:

来自NodeJS的神秘未处理promise警告[副本]

柏夕
2023-03-14

当下面的代码错误(ping()拒绝其promise)时,我会收到警告。HTTP函数似乎错误很好。我想,ping()本身一定发生了什么事情,这在某种程度上避免了try-catch。

有人能开导我吗?(这是在几次尝试改变事情以使其工作之后。)

(async () => {
    try {
            let webTask, pingTask;

            try {
                    webTask = httpsGet(urls[0]);
            } catch (e) {
                    console.log(e);
            }

            try {
                    pingTask = ping('8.8.8.8');
            } catch (e) {
                    console.log(e);
            }

            try {
                    const webResult = await webTask;
                    console.log('HTTP result:', webResult);
            } catch (e) {
                    console.log(e);
            }

            try {
                    const pingResult = await pingTask;
                    console.log('Ping result:', pingResult);
            } catch (e) {
                    console.log(e);
            }
    } catch (e) {
            console.log('Error:', e);
    }
})();
"main.js" 137 lines, 2945 characters
(node:58299) UnhandledPromiseRejectionWarning: #<Object>
(node:58299) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:58299) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
const netping = require('net-ping');
const pingSession = netping.createSession({
    retries: 0,
    timeout: 10000
});

const ping = ip => {
    return new Promise((resolve, reject) => {
            let result = { ipAddress: ip, start: new Date(Date.now()), end: null, error: null, duration_ms: -1 };

            pingSession.pingHost(ip, (error, target) => {
                    result.end = new Date(Date.now());
                    result.duration_ms = result.end - result.start;
                    if (error) {
                            result.error = error;
console.log('rejecting promise');
                            reject(result);
                    } else {
                            resolve(result);
console.log('resolving promise');
                    }
            });
    });
};

NodeJS 11.13.0

共有1个答案

公羊俭
2023-03-14

awaitjavascript构造,它将拒绝promise转换为异常。也就是说,await是处理拒绝的构造。

当你写:

try {
    pingTask = ping('8.8.8.8');
} catch (e) {
    console.log(e);
}

这里没有await,因此没有任何东西可以将拒绝转换为异常,或者以任何方式处理拒绝。

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

const test = (ms, msg) => {
    return new Promise((resolve, reject) => {
        sleep(ms).then(reject(msg)).catch(console.log);
    });
};

(async () => {
    let task1;

    try {
        const ms = 50;
        task1 = test(ms, "hey");
        await sleep(ms * 2); // otherwise you don't get an error
        await task1;
    } catch (e) {
        console.log(e);
    }
})().then(console.log).catch(console.log);

promise()构造函数开始运行test(),50毫秒后promise被拒绝,但是没有任何东西可以将拒绝转换为异常。如果我们删除100 ms的睡眠,那么await在50 ms睡眠完成之前将其“convert rejection to exception”逻辑注册到promise方式,因此当promise在调用await后49 ms被拒绝时,有一个处理程序将其转换为异常。

 类似资料:
  • 我有一个bot,它获取用户消息内容,删除用户消息,然后向消息发送私人消息。作者,然后在embed中发送用户消息的内容。在发送几条消息后,bot将发送2条消息,而不是1条,并显示警告。知道怎么修吗? 警告: superadmin@vps-XXXXXX:~/path$节点test.js(节点: 1059)UnHandledPromiseRejtionWarning: DiscordAPIError:未

  • 我一直得到“UnhandledPromiseRejectionWarning:UnhandledPromiseRejection.此错误源于在没有catch块的异步函数内部抛出,或拒绝未用.catch()处理的Promission.(拒绝ID:2)” 我已经处理了所有的承诺,但错误仍然存在

  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请

  • 我试图让Fastif-cookie工作在我的NestJS项目,我收到以下错误: (节点: 38325)未处理的promise拒绝警告:类型错误:无法读取未定义的属性“装饰请求” 未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终

  • 我试图执行下面的代码,但它在管道中抛出未处理的promise拒绝警告。在本地,它工作正常,没有任何问题。 日志错误:找不到进程“3224”。(节点:836)未处理的PromisejectionWarning:#(节点:836)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。c