【问题标题】:Firebase data returning an UNDEFINED value even though it has contentFirebase 数据返回一个 UNDEFINED 值,即使它有内容
【发布时间】:2017-08-08 06:36:26
【问题描述】:

来自我在这个网站上的recent question(在我诉诸“承诺”技术之前),我想出了一个想法,将变量存储在 firebase 数据库中,而不是在 javascript 中将其设为全局变量,这样我可以在任何函数中使用它(即使在异步函数中)。所以我做了这个代码:

function logIn(){
	var loggedUname = $("#loginUname").val();
	var loggedPword = $("#loginPword").val();
	
	var tailorRef = firebase.database().ref('tailors');
	var keyRef = firebase.database().ref();
	
	tailorRef.on('value', function(data){
		data.forEach(function(childData){
			if ( (loggedUname == childData.val().tUsername) && (loggedPword == childData.val().tPassword) ){
				currentKey = childData.key;
			}
		});
		keyRef.update({currentTailor: currentKey});
		alert("key = " + keyRef.currentTailor);
	});
	
}

.update 方法成功,因为它为登录用户存储了相应的密钥:

the updated database

但是当我尝试使用警报检索它时,它显示未定义!我不明白,因为我假设我是从数据库的根引用调用的,这是我去的最低限度。

我尝试为 keyRef 创建一个单独的 .on() 函数,但结果仍然相同。

keyRef.on('value', function(data){
  alert(data.currentTailor);
});

我是否以错误的方式调用数据?

【问题讨论】:

  • 我不知道 Firebase,但我敢打赌 keyRef.update() 是异步的。
  • firebase.googleblog.com/2016/01/… 尝试使用 .then(function(){ alert()}) 方式
  • @Barmar 我在我的 signUp 函数中使用了 .update() 并且我成功地检索了存储在这个 login() 函数中的数据。如果是你说的,我应该无法在这个函数中检索 tUsername 和 tPassword

标签: javascript firebase firebase-realtime-database


【解决方案1】:

正确的做法是:

keyRef.on('value', function(data){
 //  alert(data.val().currentTailor); see the difference 
     console.log('currentTailor ==>', data.val().currentTailor);
});

alert() 不推荐使用 javascript,因为它会冻结您的页面。请改用控制台。这样您就可以在浏览器的控制台中看到您的日志(在 chrome 中按 Ctrl+Shift+J

Firebase 的 on() 方法 returns the callback function 。要获取数据对象,您必须对该返回值使用 val() 方法。然后就可以使用对应的key获取任意值了。

 keyRef.on('value', function(data){
// here data is callback function
});

keyRef.on('value', function(data){
//data.val() returns the data in object form
});
 keyRef.on('value', function(data){
 // data.val().currentTailor to access currentTailor attribute
 });

您可以对他们每个人进行控制台以查看返回值是什么。

【讨论】:

  • 哦,成功了!我一直认为,当您在 root 中有单个值时,我不需要 .val() 并且可以直接使用它的值名称调用它。我错了。谢谢。
猜你喜欢
  • 2015-01-14
  • 2017-09-17
  • 2021-12-20
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2018-10-12
  • 2018-07-13
相关资源
最近更新 更多