如何正确使用 Firebase 的 .once() 方法将检索到的值存储在 Javascript 中?



编辑:以下不是我的真实问题。请参阅答案。

我正在使用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,这会导致错误。固定代码在上面。

最新更新