javascript - 在我登录用户后,Firebase 用户未定义?
问题描述
我有一个登录表单,它将登录用户(至少这就是我想要它做的),当我尝试从 firebase 对象获取任何用户信息时,它不起作用或它的工作很奇怪。我在下面有几乎两个相同的功能。
提交表单版本 1(不打印用户 uid,而是错误)
function lsubmitForm() {
// initiate variables with form content
var email = document.getElementById('lemail').value;
var password = document.getElementById('lpassword').value;
//login in the user
firebase.auth().signInWithEmailAndPassword(email, password).catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
var user = firebase.auth().currentUser;
console.log(user.uid)
}
lsubmitform v2(将打印出 user.uid)
function lsubmitForm() {
// initiate variables with form content
var email = document.getElementById('lemail').value;
var password = document.getElementById('lpassword').value;
//login in the user
firebase.auth().signInWithEmailAndPassword(email, password).catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
console.log(user.uid)
} else {
}
});
}
为什么会这样?为什么后一个片段会记录 user.uid?它是某种类型的范围问题吗?为什么第一个片段无法抓取当前用户?是异步调用吗?我是否需要强制它在登录用户后等待打印出 uid?我不确定如何解决这个问题,javascript 不是我的强项。
提交表单时调用该函数。
解决方案
在您的第一个片段中,您不会等待注册用户完成的承诺。您应该声明您的函数异步,然后添加等待。这样它将等待该过程完成然后继续
function lsubmitForm() async {
// initiate variables with form content
var email = document.getElementById('lemail').value;
var password = document.getElementById('lpassword').value;
//login in the user
await firebase.auth().signInWithEmailAndPassword(email, password).catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
var user = firebase.auth().currentUser;
console.log(user.uid)
更改在第一行,添加了异步,以及在开始时等待的注册用户。我建议您查看有关 async/await 的 google 文档,其中有一些非常好的视频。
推荐阅读
- python-3.x - 如何生成具有重复元素的列表元素列表
- sql - sql查询计数并显示全名
- domain-driven-design - 如何使用 CQRS 将后端业务域模型中的只读计算公开到前端?读取模型与写入模型问题
- sql-server - 如何匹配从 MVC 5 中的数据库中获取的字符串中的特定字符串?
- corda - 独立编织服务器 - 错误:无法解析或解析类型 => 无法注册流
- java - 我们如何决定是否为接口方法提供默认的空实现(Defender 方法)?
- angular - vscode ng服务一次又一次的编译
- android - 在自定义列表中添加搜索框
- python-3.x - 将 2 个具有不同列数的数据框组合起来,并用 sum 聚合它们
- android - NoSuchFieldError:在仅 kotlin 模块中使用 MockWebServer 时的伴侣