提问者:小点点

UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“length”


(节点:55028)UnhandledPromiserEjectionWarning:TypeError:无法读取位于/users/PatrickStanciu/WebStormProjects/AUTISMAssistant/Backend/API/Controllers/PaymentsController.js:1045:34
位于processTicksAndRejections(internal/Process/Task_Queues.js:94:5)(节点:55028)的UnhandledPromiserEjectionWarning:未处理的承诺拒绝。
此错误源于抛入没有catch块的异步函数内部,或拒绝未用.(拒绝ID:1)
(节点:55028)[DEP0018]拒绝警告:拒绝未经处理的承诺。将来,未处理的承诺拒绝将以非零退出代码终止node.js进程。

当我尝试使用一个用户登录时,在我的Node.js后端出现了这个错误。为什么会出现?下面是一行:

   if (!profilePromise.rows.length) {
            resolve({
                success: true,
                cardDetails: null,
                planId: null
            })
            return;
        }

我对上面的“长度”有问题


共1个答案

匿名用户

根据名称,profilepromise是一个承诺。承诺没有rows属性,因此profilepromise.rowsundefined并且您不能从undefined中读取任何属性。

您需要使用Promission并使用它的实现值,我猜它是带有lengty属性的东西:

profilePromise
.then(rows => {
    if (rows.length) {
        resolve(/*...*/);
    }
})
.catch(error => {
    // ...handle/report the error...
    // Probably `reject` here?
});

更多关于在这里使用承诺。

附带说明:假设profilepromise确实是一个promission是正确的,那么这就意味着这个代码正在成为显式promission创建反模式的牺牲品。与其创建自己的承诺然后调用resolvereject,不如链接到现有的承诺:

return profilePromise
    .then(rows => {
        if (rows.length) {
            return {
                success: true,
                cardDetails: null,
                planId: null
            };
        }
        // Either return something else here, or `throw` if `rows` not having
        // a truthy `length` is an error
    });