如何在Firebase值事件上设置监听器?

5
如何使用Node.js正确设置Firebase的值事件监听器?
我正在阅读Firebase文档,已成功从我的Mac和同时连接到相同Firebase数据库的树莓派上更新了表格和行,但是我无法理解如何在值事件上创建监听器。
var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', function(snapshot) {
    updateStarCount(postElement, snapshot.val());
});

对我来说很明显,我需要以输出为基础定义postElement

FIREBASE WARNING: Exception was thrown by user callback. ReferenceError: postElement is not defined

然而,我不知道postElement应该是什么,也不知道如何定义它。求助!
我制作了一个非常小的程序和表格来简单地更新/更改值。并且我修改了程序,以便在更改行时可以看到控制台输出。
这是我的小用户数据变量,只是为了让您知道我要尝试更改的数据很少:
var user = {
    id:Number,
    name:String,
    number:Number
};

var users = [user];

这是我对文档代码的更改,以便在Node.js运行时在控制台输出中看到一些内容:
var userRef = firebase.database().ref('/users/user' + users[0].id);
userRef.on('value', function(snapshot){
    firebase.app.updateUserInfo(postElement, snapshot.val());
    console.log('Users' + users[0].name + ' changed.');//<- this is the line I added.
});

注意: updateStarCount 函数来自 Firebase 文档中的示例,与该示例相关,我谨慎地假设它更新了本地 Firebase 数据库...
注意2:如果 updateStarCount 做了其他的魔法,则这是 Firebase 的文档缺陷,因为该函数在文档中没有定义。非常感谢任何帮助澄清此文档的人。

这个 updateStarCount 函数是从哪里来的?它绝对不是来自 Firebase。 - vzsg
@vzsg 如果您查看Firebase页面并搜索updateStarCount,您将在链接的页面中找到它。 - NonCreature0714
啊,我明白了。我应该把它表述为“不是来自Firebase SDK”。这只是示例代码,比伪代码具体性稍微高一些。那里的想法假设您有一个函数,可以使用结果更新HTML元素 - 在实际应用程序中,您必须用自己的逻辑替换它。 - vzsg
@vzsg 明白了... 我想进一步问一下,如何理解这个文档示例?在那之前,一切都很清楚。 - NonCreature0714
想象一个网络应用程序,其中有帖子和评分,这些评分显示为星星...请注意,您正在阅读Web指南(浏览器JavaScript),而不是Node Admin SDK的指南。 - vzsg
@vzsg 非常感谢你的帮助!文档里到处都是链接,很容易引人误解... - NonCreature0714
2个回答

9
为了使这个问题对其他寻找相同问题的人有所帮助,下面是一个扩展示例,其中包含缺少定义的函数和变量:
为了让其他人更好地理解这个问题,这里提供了一个扩展示例,其中包含了缺失的函数和变量定义:
// some HTML element on the page
var postElement = document.getElementById("postElement");

// here I will assume that this function simply 
// updates the contents of the element with a value
var updateStarCount = function(element, value) {
    element.textContent = value;
};

var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', function(snapshot) {
    updateStarCount(postElement, snapshot.val());
});

使用此JavaScript,您可以假定HTML页面如下所示:
<html>
  <body>
    <div id="postElement"></div>
  </body>
</html>

2

跟随IgorNikolaev的例子...为了使这篇文章对于在树莓派或独立应用(而不是网页)上遇到同样问题的人更有用。

感谢@vzsg,Firebase Admin SDK可能更适合我的情况。

创建一个完全工作示例的步骤如下...

这仅涵盖写入数据库的内容,其结果可以在登录Firebase的控制台时查看。

首先,创建Firebase管理身份验证,然后:

var admin = require("firebase-admin");
admin.initializeApp({
    credential:admin.credential.cert("/path/to/credential/cert.json"),
    databaseURL: "databaseURLhere"
});

var db = admin.database();
var ref = db.ref("/");
console.log('DB ref: ' + ref);

var usersRef = ref.child("users");

使用set在数据库中创建新值。但是要小心,set会覆盖预先存在的值。

usersRef.set({ //With completion callback.
    alanisawesome: {
      date_of_birth: "June 23, 1912",
      full_name: "Alan Turing"
    },
    gracehop: {
      date_of_birth: "December 9, 1906",
      full_name: "Grace Hopper"
    }
  },
  function(error) { //NOTE: this completion has a bug, I need to fix.
    if (error) {
      console.log("Data could not be saved." + error);
    } else {
      console.log("Data saved successfully.");
    }
});

使用update向行添加新列(或更改当前数据),但一定要特别小心,给出列的路径,否则所有先前的列都会被覆盖,而不是附加到表中:

usersRef.update({
    "alanisawesome/nickname": "Alan The Machine",
    "gracehop/nickname": "Amazing Grace"
  },
  function(error){
    if(error){
      console.log("Data could not be updated." + error);
    } else {
      console.log("Data updated successfully.");
    }
  });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接