Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储在localstorage中的Firebase用户不';不行?(javascript)_Javascript_Firebase_Firebase Authentication_Local Storage - Fatal编程技术网

存储在localstorage中的Firebase用户不';不行?(javascript)

存储在localstorage中的Firebase用户不';不行?(javascript),javascript,firebase,firebase-authentication,local-storage,Javascript,Firebase,Firebase Authentication,Local Storage,创建时,我将用户对象保存在localstorage中(以确保以后可以在自定义函数内部、authStateChanged外部使用它): 然后我在下面的自定义函数中检索它,它在像user.uid那样使用时工作,但在用作user.delete()时会出现错误“user.delete不是函数”,这是为什么?变量user在localStorage中如下所示: 我的自定义功能: var myTimer; function validTimer(timerValid){ var user = JSON.

创建时,我将用户对象保存在localstorage中(以确保以后可以在自定义函数内部、authStateChanged外部使用它):

然后我在下面的自定义函数中检索它,它在像
user.uid
那样使用时工作,但在用作
user.delete()
时会出现错误“user.delete不是函数”,这是为什么?变量
user
在localStorage中如下所示:

我的自定义功能:

var myTimer;
function validTimer(timerValid){
  var user = JSON.parse(localStorage.getItem('fireUser'));
  // var buser = firebase.auth().currentUser; <-- doesn't work here
  myTimer = setInterval(function() {
      timerValid++;
      localStorage.setItem('fireTimer', timerValid);
      if (timerValid == 22) {
        // delete in database
        var userId = user.uid;
        var ref = firebase.database().ref().child('users');
        ref.child(userId).once("value", function(snapshot){
          if (snapshot.exists()){
            database.ref("users/"+userId).remove();
          }
        });
        // delete account
        user.delete().then(function() {  // this says user.delete is not a function
        }).catch(function(error) {
        });
      }
  }, 1000);
}
var-myTimer;
功能有效计时器(TimerValidTimer){
var user=JSON.parse(localStorage.getItem('fireUser');

//var buser=firebase.auth().currentUser;当您对其进行字符串化并对其进行解析时,它将从实例方法中剥离。delete方法是firebase用户对象的实例方法。在这种情况下,您的用户虽然看起来相同,但不是firebase用户。它只是一个裸对象

编辑 要通过客户端SDK持久化firebase用户,您需要使用
firebase.auth().onAuthStateChanged()
方法。重新加载页面后不久,将触发此方法。在此处进行设置。直接从:


当你字符串化一个实例,然后将其解析回一个对象时,其实例被剥离,因此删除了方法。我很惊讶你得到了一个空错误。这是你调用删除方法时得到的实际错误吗?@Vincent my bad错误实际上是:“user.delete不是一个函数”@Vincent问题是,我只是尝试在没有JSON stringfy和parse的情况下保存它,但它仍然抛出相同的错误。那么我应该如何存储和检索它呢?答案很好Vincent!两方面都正确:1)由于您将
用户
序列化为JSON,而JSON不支持方法,因此
用户
对象的任何方法都会丢失。2)正确的方法是在需要
用户的地方简单地附加一个
onAuthStateChanged
侦听器。虽然回调结构最初看起来很奇怪,但最终你会习惯它。不是“如果(用户)”仅当用户已登录时才工作?当用户未登录时,我的计时器功能必须工作。如果我将保存当前用户的变量放在“}else{”中,则用户返回null且不工作。我知道authStateChanged这件事,如我在文章中所述,问题是如果重新加载页面(用户)已不存在。我正在尝试在创建时保存用户,并使用计时器检查用户是否验证,如果不删除它。我认为可以使用localStorage和计时器。如果用户未登录,则无法使用客户端sdk删除用户。如果您尝试存储firebase用户以便可以在代码的其他部分访问它,请将其设置为globally on window或某些singleton类中,u可以注入。如果您试图仅让用户在验证其电子邮件后登录,则在用户登录后,检查auth对象的emailVerified属性。如果已设置,请让他们通过,否则请注销并告诉他们验证。如果是这种情况,请在登录后将其注销发送电子邮件。Firebase auth有速率限制。请参阅。至于清除伪造帐户,您当然不应该/不能在客户端代码中处理此问题。您将希望使用。
var myTimer;
function validTimer(timerValid){
  var user = JSON.parse(localStorage.getItem('fireUser'));
  // var buser = firebase.auth().currentUser; <-- doesn't work here
  myTimer = setInterval(function() {
      timerValid++;
      localStorage.setItem('fireTimer', timerValid);
      if (timerValid == 22) {
        // delete in database
        var userId = user.uid;
        var ref = firebase.database().ref().child('users');
        ref.child(userId).once("value", function(snapshot){
          if (snapshot.exists()){
            database.ref("users/"+userId).remove();
          }
        });
        // delete account
        user.delete().then(function() {  // this says user.delete is not a function
        }).catch(function(error) {
        });
      }
  }, 1000);
}
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
    var displayName = user.displayName;
    var email = user.email;
    var emailVerified = user.emailVerified;
    var photoURL = user.photoURL;
    var isAnonymous = user.isAnonymous;
    var uid = user.uid;
    var providerData = user.providerData;
    // ...
  } else {
    // User is signed out.
    // ...
  }
});