Javascript Firebase web实时数据库未更新
当我通过firebase密码验证创建新用户时,我正在尝试使用用户信息更新firebase实时数据库。成功登录后,我将转到另一页。问题是,我的数据库没有得到更新,但在上述情况下,如果留在登录页面,不改变任何其他网址;数据库得到更新 这是我的创建用户代码Javascript Firebase web实时数据库未更新,javascript,firebase,firebase-realtime-database,firebase-authentication,Javascript,Firebase,Firebase Realtime Database,Firebase Authentication,当我通过firebase密码验证创建新用户时,我正在尝试使用用户信息更新firebase实时数据库。成功登录后,我将转到另一页。问题是,我的数据库没有得到更新,但在上述情况下,如果留在登录页面,不改变任何其他网址;数据库得到更新 这是我的创建用户代码 firebase .auth() .createUserWithEmailAndPassword(email, password) .then((userCredential) => { // Sign
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");
}
});
此调用是异步的:
db.ref("/").set({
uid: user.uid,
});
这意味着在set()
函数返回后,代码将继续运行,并将数据异步发送到数据库。但是当您更改window.location
时,它会中断此写入操作。这也是为什么当您不将用户发送到新位置时,它可以工作的原因:写入操作可以在不中断的情况下完成
一个简单的快速修复方法是在更新数据库时标记:
isCreatingUser=true;//我尝试使用此状态标志方法,并且可以成功更新数据库,但现在未执行window.location。我是否需要异步执行此操作。是的,您需要在数据库写入完成后调用此操作,因为此时,onAuthStateChanged
将已经运行。我更新了我的答案来说明这一点。这非常有效。谢谢@Frank