javascript - 在从注册表单中检索名称之前触发 Firebase onAuthStateChanged()?
问题描述
我正在使用普通的 HTML、CSS 和 JS 创建一个仪表板,并将 Firebase 作为我的后端。在我的signup.html
页面中,我有一个表单,允许用户输入他们的姓名以及他们的电子邮件地址和密码。注册后,用户将被重定向到dashboard.html
他们的个性化内容。在仪表板内部,它有一个显示其名称的位置。
问题是它并不总是从表单中获取名称,如果它没有从注册表单中获取用户名,那么它只是没有他们的名字,因为我没有“添加名称”功能仪表板。我怀疑这是因为我使用onAuthStateChanged()
inside的方式signup.html
。
以下是我的注册页面JS代码:
firebase.auth().onAuthStateChanged(function (user) {
if (user) {
window.location.replace('dashboard.html')
} else {
return
}
});
document.querySelector('#signup_btn').addEventListener("click", (e) => {
e.preventDefault();
var user_email = document.getElementById('user_email').value;
var user_pass = document.getElementById('user_pass').value;
var user_name = document.getElementById('user_name').value;
// Sign Up
firebase.auth().createUserWithEmailAndPassword(user_email, user_pass)
// Success
.then((userCredentials) => {
userCredentials.user.updateProfile({
displayName: user_name
})
})
// Errors
.catch(function (error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
if (errorCode == 'auth/weak-password') {
alert('The password is too weak.');
} else {
alert(errorMessage);
}
console.log(error);
});
})
如果有帮助,这是我signup.html
页面中的表格:
<form>
<h1>Sign Up</h1>
<!-- <h2>Log into your account using your email address</h2> -->
<label for="user_name">Name</label>
<input type="text" name="name" id="user_name">
<label for="user_email">Email Address</label>
<input type="text" name="email" id="user_email">
<label for="user_pass">Password</label>
<input type="password" name="Password" id="user_pass">
<button type="submit" id="signup_btn">Sign Up</button>
<p>Already have an account? <a href="./index.html">Log In</a></p>
</form>
解决方案
似乎您的onAuthStateChanged
侦听器在写入数据库完成之前被触发。这是 API 的预期行为,但不是您想要的。
由于您确实想使用onAuthStateChanged
侦听器在页面重新加载时导航,所以我能想到的最好的方法是在用户单击注册按钮时关闭侦听器:
// store the unsubscribe function in a variable
var unsubscribe = firebase.auth().onAuthStateChanged(function (user) {
if (user) {
window.location.replace('dashboard.html')
} else {
return
}
});
document.querySelector('#signup_btn').addEventListener("click", (e) => {
e.preventDefault();
unsubscribe(); // turn off auth state listener
var user_email = document.getElementById('user_email').value;
var user_pass = document.getElementById('user_pass').value;
var user_name = document.getElementById('user_name').value;
// Sign Up
firebase.auth().createUserWithEmailAndPassword(user_email, user_pass)
// Success
.then((userCredentials) => {
return userCredentials.user.updateProfile({ // add a return
displayName: user_name
})
})
.then(() => {
window.location.replace('dashboard.html') // explicitly navigate here
})
推荐阅读
- jasper-reports - Jasper:如何将数据源中的 HTTP 标头从 Jaspersoft Studio 保留到服务器?
- javascript - 如何在 Vue.js 的子组件中正确传递方法?
- python - 在 Jupyter Notebook for Anaconda3 中导入自定义 .py 文件
- excel - 为什么带有范围标准的 excel SUMIF 不能按预期工作?
- exploit - 哪个漏洞利用和哪个有效负载使用?
- javascript - Vue.js 结合来自 RESP API 的数据
- python - Python:欧拉电路和欧拉路径
- java - 可滚动视图
- php - 具有许多属性的不可变对象
- matlab - Matlab查找表