UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство 'length' из неопределенного - PullRequest
0 голосов
/ 11 февраля 2020

(узел: 55028) UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство 'length' свойства undefined в /Users/patrickstanciu/WebstormProjects/autismassistant/backend/api/controllers/paymentsController.js2: 1045:34100 * at processTicksAndRejected (внутренняя / process / task_queues. js: 94: 5) (узел: 55028) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.
Эта ошибка возникла из-за броска внутрь асинхронной c функции без блока перехвата или отклонив обещание, которое не было обработано с помощью .catch (). (идентификатор отклонения: 1)
(узел: 55028) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания устарело. В будущем отклонения обещания, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения.

У меня есть эта ошибка в моем node.js бэкэнде, когда я пытаюсь войти с пользователь. Почему это появляется? Вот строка:

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

У меня проблемы с "длиной" выше

1 Ответ

1 голос
/ 11 февраля 2020

Исходя из названия, profilePromise - это обещание. Обещания не имеют свойства rows, поэтому profilePromise.rows равно undefined, и вы не можете прочитать какие-либо свойства из undefined.

Вам необходимо потреблять обещание и использовать его значение выполнения, которое, как я предполагаю, имеет свойство length:

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

Подробнее об использовании обещаний здесь .


Примечание: Предполагая, что я прав, что profilePromise действительно обещание, оно предполагает, что этот код становится жертвой явного создания антипаттерна обещания . Вместо того, чтобы создавать собственное обещание, а затем вызывать resolve или reject, добавьте цепочку к существующему обещанию:

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
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...