(节点: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;
}
我上面的“长度”有问题
答案 0 :(得分:1)
根据名称,profilePromise
是一个承诺。承诺没有rows
属性,因此profilePromise.rows
是undefined
,您无法从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的牺牲品。无需创建自己的承诺,然后调用resolve
或reject
,而是链接到现有的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
});