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

时间:2020-02-11 18:10:17

标签: javascript node.js backend

(节点:55028)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“ length” 在/Users/patrickstanciu/WebstormProjects/autismassistant/backend/api/controllers/paymentsController.js:1045:34
在processTicksAndRejections(内部/进程/task_queues.js:94:5) (节点:55028)UnhandledPromiseRejectionWarning:未处理的承诺被拒绝。
该错误是由于在没有catch块的情况下抛出异步函数而引起的,或者是由于拒绝了未经.catch()处理的诺言而引起的。 (拒绝ID:1)
(节点:55028)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

当我尝试与用户登录时,我的node.js后端出现此错误。为什么会出现? 这是一行:

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

我上面的“长度”有问题

1 个答案:

答案 0 :(得分:1)

根据名称,profilePromise是一个承诺。承诺没有rows属性,因此profilePromise.rowsundefined,您无法从undefined中读取任何属性。

您需要消费承诺并使用其实现值,我猜这是带有length属性的东西:

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

有关使用承诺here的更多信息。


旁注:假设我对profilePromise确实是一个承诺,那表明此代码已成为the explicit promise creation antipattern的牺牲品。无需创建自己的承诺,然后调用resolvereject,而是链接到现有的Promise:

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
    });