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

时间:2016-12-25 18:28:51

标签: javascript node.js firebase raspberry-pi firebase-realtime-database

如何使用Node.js?

正确设置Firebase的值事件监听器

我正在阅读Firebase's documents,并且已经成功地从我的Mac和我的Raspberry Pi同时运行的Firebase数据库上更新了表格和行,连接到同一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的文档漏洞,因为该函数没有在那里定义。任何澄清此文档的帮助将不胜感激。

2 个答案:

答案 0 :(得分:6)

为了使这个问题对于同样问题的其他人有帮助,这里有一个扩展的例子来自缺少函数和变量定义的问题:

// 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>

答案 1 :(得分:1)

按照IgorNikolaev的例子......为了使这篇文章对Raspberry Pi上的Node.js有相同问题或者作为独立应用程序(不适用于网页)的人更有用。

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

创建完整工作示例的步骤是......

这仅包括写入数据库,登录到Firebase控制台时可以看到其结果。

首先,create Firebase admin authentication,然后:

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.");
    }
  });