Firebase-未捕获(在promise中)TypeError:无法读取属性

Firebase - Uncaught (in promise) TypeError: Cannot read property

本文关键字:TypeError 属性 读取 promise Firebase-      更新时间:2023-09-26

我有两个文本框,一个用于用户名,另一个用于密码。

<input type="text" id="username">
<input type="text" id="password">
<input type="button" value="Login" onclick="authenticateUser()">

这是防火基地代码:

function authenticateUser() {
  var username = document.getElementById('username').value;
  var password = document.getElementById('password').value;
  database.ref('users/'+username).once('value').then(function(snapshot) {
    var email = snapshot.val().email;
    console.log(email);
  });
}

上面写着:

未捕获(承诺中)类型错误:无法读取空的属性"email"

上面的firebase代码可以工作,如果用户名匹配就会获取电子邮件,但如果用户名不存在怎么办?如果不存在,就会抛出TypeError,如何捕捉该错误?

不幸的是,这不起作用:

function authenticateUser() {
  var username = document.getElementById('username').value;
  var password = document.getElementById('password').value;
  database.ref('users/'+username).once('value').then(function(snapshot) {
    var email = snapshot.val().email;
    console.log(email);
  }, function(error) {
    console.log('Invalid Username');
  });
}

在电子邮件和密码验证的情况下,有catch

firebase.auth().createUserWithEmailAndPassword(email, password).catch(function(error) {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
});

在Java中,有类似的东西

catch(TypeError error) {
    //Do whatever you want to do
}
try {
   snapshot.val().email
} catch(e) {
    if (e instanceof TypeError) {
    ....
    }
}

更多https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch

但你似乎也可以通过空检查(这通常比触发可避免的异常更适合"流量控制")

var user = snapshot.val();
if (user == null) { /* error */}