Функция Firebase обещает неопределенный TypeError - PullRequest
0 голосов
/ 29 марта 2020

В настоящее время я использую функции firebase для вызова следующей команды do c из базы данных:

let token, userId;
db.doc(`/users/${newAccount.username}`)
    .get()
    .then((doc) => {
        if (doc.exists === false) {
            return firebase.auth().createUserWithEmailAndPassword(newAccount.email, newAccount.password).catch(err => console.error(err));
        } else {
            res.status(400).json({ username: 'this username is already taken' });
        }

    })

    .then(data => {
        userId = data.user.uid;
        return data.user.getIdToken();
    })

    .then((idToken) => {
        token = idToken;
        const userCredentials = {
            username: newAccount.username,
            email: newAccount.email,
            created: new Date().toISOString(),
            userId
        };
        return db.doc(`/users/${newAccount.username}`).set(userCredentials);

    })

    .then(() => {
        return res.status(201).json({ token });
    })
    .catch((err) => {
        console.error(err);
        if (err.code === 'auth/email-already-in-use') {
            return res.status(400).json({ email: 'Email is already is use' });
        } else {
            return res.status(500).json({ general: 'Something went wrong, please try again' });
        }
    });

Код работает нормально, но в журнале возникает ошибка, если do c существует в база данных:

TypeError: Cannot read property 'user' of undefined

Я предполагаю, что обещание все еще выполняется, и я немного застрял в том, как его закончить?

Любая помощь будет благодарна. Спасибо.

1 Ответ

1 голос
/ 29 марта 2020

Ваш второй then обратный вызов будет вызываться во всех ситуациях. Отправка ответа 400 в первом обратном вызове на самом деле не остановит распространение обещания на все следующие then обратные вызовы.

Если вы хотите остановить выполнение цепочки обратных вызовов then, вместо этого вы должны выбросить ошибку, чтобы получить catch вниз по цепочке, пропуская все then.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...