Firebase函数承诺未定义TypeError

时间:2020-03-29 16:50:25

标签: javascript node.js firebase firebase-realtime-database

我目前正在使用firebase函数从数据库中调用以下文档:

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

如果文档存在于数据库中,则代码可以正常运行,但是会记录错误:

TypeError: Cannot read property 'user' of undefined

我认为诺言仍然在履行,而我对如何结束诺言却有些困惑?

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

您的第二个then回调将在所有情况下被调用。在第一个回调中发送400响应实际上并不会阻止承诺传播到以下所有then回调中。

如果要停止执行then回调链,则应该抛出一个错误,以使catch沿链下降,从而跳过所有then