我目前正在使用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
我认为诺言仍然在履行,而我对如何结束诺言却有些困惑?
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
您的第二个then
回调将在所有情况下被调用。在第一个回调中发送400响应实际上并不会阻止承诺传播到以下所有then
回调中。
如果要停止执行then
回调链,则应该抛出一个错误,以使catch
沿链下降,从而跳过所有then
。