首页 > 解决方案 > 在我登录用户后,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 不是我的强项。

提交表单时调用该函数。

标签: javascriptfirebasefirebase-authentication

解决方案


在您的第一个片段中,您不会等待注册用户完成的承诺。您应该声明您的函数异步,然后添加等待。这样它将等待该过程完成然后继续

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 文档,其中有一些非常好的视频。


推荐阅读