存储在localstorage中的Firebase用户不';不行?(javascript)
创建时,我将用户对象保存在localstorage中(以确保以后可以在自定义函数内部、authStateChanged外部使用它): 然后我在下面的自定义函数中检索它,它在像存储在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.
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.
// ...
}
});