编辑:以下不是我的真实问题。请参阅答案。
我正在使用Google Firebase使用简单的HTML/JavaScript聊天客户端。以下代码旨在是注册和登录用户的基本系统,其中该功能在1和2位置提供了包含用户名和密码的数组($ usr)。
然后,根据数据库的结果(Getuser varible,构造为用户OBJ)检查本地用户名和密码$ usr [1-2],以确定是否已经获取了用户名或用户的凭据是否有效。请注意,这是一个个人项目,数据不打算敏感。
//Registers user credentials with input [cmd, user, pass]
var auth = function ($usr) {
var db = firebase.database().ref('chatapp/users/' + $usr[1]);
var getuser;
user = {'name': $usr[1], 'pass': $usr[2]};
db.once('value').then(function(snapshot) {
getuser = snapshot.val();
if ($usr[0] === "/register") {
if (getuser.name !== $usr[1]) {
db.set(user);
notify('Registered ' + $usr[1] + ' with pass "' + $usr[2] + '"');
} else {
notify('Username "' + $usr[1] + '" already taken, try again');
}
} else if ($usr[0] === "/login") {
if (getuser.name !== $usr[1] || getuser.pass !== $usr[2]) {
notify('Invalid credentials ' + $usr[1] + ':' + $usr[2]);
} else {
notify($usr[1] + ' logged in');
}
}
});
};
这个问题在db.once()上发挥了作用。数据正在检索但延迟。如果用户试图注册(getuser.name!== $ usr1)将始终返回true,因为该变量设置为未定义。但是,登录命令完美地工作,因为那时Getuser已将其设置为从Firebase检索的值。
我尝试使用.once()仅设置变量,或者作为返回snapshot.val()的函数。我已经尝试在.once()和使用snapshot.val()[name]和[pass]的回调中包括所有代码,而不是将其存储到变量上。解决此问题的唯一解决方案似乎是程序流中的手动断裂。
此外,我还发现,使用getuser [name]在getuser.name确实有效的情况下不起作用,这是没有意义的,并且进一步激怒了我。请帮忙,是凌晨2:12。
这是官方文件。这是一个相关的Stackoverflow问题,这可能是我正在寻找的解决方案,但我不明白。
真正让我感到困惑的是,以下功能。
这是对我有用的代码:
//Registers user credentials with input [cmd, user, pass]
var auth = function ($usr) {
var db = firebase.database().ref('chatapp/users/' + $usr[1]);
var getuser;
user = {'name': $usr[1], 'pass': $usr[2]};
db.once('value').then(function(snapshot) {
getuser = snapshot.val();
if ($usr[0] === "/register") {
if (getuser === null) {
db.set(user);
notify('Registered ' + $usr[1] + ' with pass "' + $usr[2] + '"');
} else {
notify('Username "' + $usr[1] + '" already taken, try again');
}
} else if ($usr[0] === "/login") {
if (getuser.name !== $usr[1] || getuser.pass !== $usr[2]) {
notify('Invalid credentials ' + $usr[1] + ':' + $usr[2]);
} else {
notify($usr[1] + ' logged in');
}
}
});
};
这个问题实际上不是我的问题。使我相信数据的检索延迟的原因是我的代码最初不在.once()
方法的回调函数之外。如果使用.once()
的回调函数将snapshot.val()
写入变量,然后在回调函数之外编写代码的其余部分,则数据是异步编写的,并且您的变量将设置为undefined
,直到可以从真实值中检索到可从中获取真实值服务器。我相信,解决方法正在调用参数snapshot.val()
的函数,或者简单地在回调中写入代码(上图)。
我的代码的实际问题是与行if (getuser.name !== $usr[1])
有关。如果getuser
的值为null
,这会导致错误。固定代码在上面。