当我通过 firebase 密码身份验证创建新用户时,我正在尝试使用用户信息更新我的 firebase 实时数据库。成功登录后,我将转到另一个页面。问题是我的数据库在上述情况下没有更新,但是如果停留在登录页面并且不更改为任何其他 url;数据库得到更新。
这是我创建的用户代码
firebase
.auth()
.createUserWithEmailAndPassword(email, password)
.then((userCredential) => {
// Signed in
var user = userCredential.user;
if (user !== null) {
const db = firebase.database();
db.ref("/").set({
uid: user.uid,
});
}
// ...
})
.catch((error) => {
var errorCode = error.code;
var errorMessage = error.message;
console.log(errorCode, errorMessage);
// ..
});
这里是我要切换到另一个页面的地方,
firebase.auth().onAuthStateChanged((user) => {
if (user) {
// User is signed in, see docs for a list of available properties
// https://firebase.google.com/docs/reference/js/firebase.User
var uid = user.uid;
console.log(user);
//If I remove the below line, database is updated
window.location.href = "../html/home.html";
// ...
} else {
// User is signed out
// ...
console.log("not logged in");
}
});
答案 0 :(得分:0)
这个调用是异步的:
db.ref("/").set({
uid: user.uid,
});
这意味着代码在set()
函数返回后继续运行,并将数据异步发送到数据库。但是当您更改 window.location
时,它会中断此写入操作。这也是当您不将用户发送到新位置时它起作用的原因:然后写入操作可以不间断地完成。
一个快速简单的修复方法是在更新数据库时进行标记:
isCreatingUser = true; // ? Flag that we're creating a user
firebase
.auth()
.createUserWithEmailAndPassword(email, password)
.then((userCredential) => {
var user = userCredential.user;
if (user !== null) {
const db = firebase.database();
db.ref("/").set({
uid: user.uid,
}).then(() => {
isCreatingUser = false; // ? We're done
window.location.href = "../html/home.html"; // ? Navigate away
}).catch((e) => {
isCreatingUser = false; // ? We're done
throw e;
})
}
// ...
})
.catch((error) => {
var errorCode = error.code;
var errorMessage = error.message;
console.log(errorCode, errorMessage);
// ..
isCreatingUser = false; // ? We're done
});
然后:
firebase.auth().onAuthStateChanged((user) => {
if (user && !isCreatingUser) {
...
您可能需要更多的同步,但这就是它的要点。