为了学习Angular 2,我正在尝试他们的教程。

我得到一个这样的错误:

(node:4796) UnhandledPromiseRejectionWarning: Unhandled promise rejection (r                                                                                                     ejection id: 1): Error: spawn cmd ENOENT
[1] (node:4796) 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.

我在SO中浏览了不同的问题和答案,但没有找到什么是“未处理的承诺拒绝”。

谁能简单地告诉我它是什么,也什么错误:产卵cmd ENOENT是,当它出现时,我必须检查摆脱这个警告?


当前回答

"弃用警告:未处理的承诺拒绝已弃用"

TLDR: promise具有resolve和reject,在不使用catch来处理它的情况下进行reject是不推荐的,所以你至少必须在顶级有一个catch。

其他回答

我在NodeJS中也遇到过类似的问题,罪魁祸首是forEach循环。注意forEach是一个同步函数(不是异步函数)。因此,它只是忽略了返回的承诺。 解决方案是使用for-of循环: 我得到错误的代码:

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误是由于在没有catch块的异步函数中抛出,或者由于拒绝未使用.catch()处理的promise而引起的。

如下:

permissionOrders.forEach( async(order) => {
        const requestPermissionOrder = new RequestPermissionOrderSchema({
            item: order.item,
            item_desc: order.item_desc,
            quantity: order.quantity,
            unit_price: order.unit_price,
            total_cost: order.total_cost,
            status: order.status,
            priority: order.priority,
            directOrder: order.directOrder
        });

        try {
            const dat_order = await requestPermissionOrder.save();
            res.json(dat_order);
        } catch(err){
            res.json({ message : err});
        }
    });

以上问题的解决方法如下:

for (let order of permissionOrders){
        const requestPermissionOrder = new RequestPermissionOrderSchema({
            item: order.item,
            item_desc: order.item_desc,
            quantity: order.quantity,
            unit_price: order.unit_price,
            total_cost: order.total_cost,
            status: order.status,
            priority: order.priority,
            directOrder: order.directOrder
        });

        try {
            const dat_order = await requestPermissionOrder.save();
            res.json(dat_order);
        } catch(err){
            res.json({ message : err});
        }
    };

当我实例化一个promise时,我将生成一个异步函数。如果函数运行正常,那么我调用RESOLVE,然后流继续在RESOLVE处理程序中,在then中。如果函数失败,则通过调用REJECT终止函数,然后流在CATCH中继续。

在NodeJs中,拒绝处理程序被弃用。你的错误只是一个警告,我在node.js github中阅读了它。我找到了这个。

DEP0018:未处理的承诺拒绝 类型:运行时 不赞成未处理的承诺拒绝。将来,没有处理的promise拒绝将使用非零退出码终止Node.js进程。

在向数据库发送数据之前,尝试不要关闭连接。删除client.close ();从你的代码,它会工作得很好。

"弃用警告:未处理的承诺拒绝已弃用"

TLDR: promise具有resolve和reject,在不使用catch来处理它的情况下进行reject是不推荐的,所以你至少必须在顶级有一个catch。

在我的例子中是Promise,没有拒绝也没有解决,因为我的Promise函数抛出了一个异常。此错误导致UnhandledPromiseRejectionWarning消息。