2016-12-25 57 views
2

如何使用Node.js使用Firebase正确设置值事件侦听器?如何在Firebase值事件上设置侦听器?

我读通过Firebase's documents并已成功地能够从我的两个苹果,我的树莓派运行的同时,连接到同一个数据库火力地堡上更新我的火力地堡数据库表和行;但是,我不能明白我需要这个领域做制作一个数据事件的监听器:

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功能是从火力地堡文档中的例子,有意义的例子有,我小心翼翼地承担更新本地火力地堡分贝...

注意2:如果updateStarCount正在做一些其他的魔术,那么它是Firebase的文档缺陷,因为函数没有在那里定义。任何帮助澄清本文档将不胜感激。

+0

此'updateStarCount'函数来自哪里?这绝对不是来自Firebase。 – vzsg

+0

@vzsg如果您检查[Firebase页面]的链接(https://firebase.google.com/docs/database/web/read-and-write)并搜索'updateStarCount',您可以在链接页面。 – NonCreature0714

+0

啊,我明白了。我应该将其表述为“不是来自Firebase SDK”。这只是示例代码,并不比伪代码更具体。这里的想法假设你有一个函数用结果更新HTML元素 - 你必须用真实应用程序中的自己的逻辑来替换它。 – vzsg

回答

4

为了让其他人寻找到同样的问题,这个问题有帮助,这里是从缺失的函数和变量的问题定义的扩展的例子:

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

继IgorNikolaev的例子......为了让这个帖子更有助于其在树莓派的或作为一个独立的应用程序(不适用于网页)与Node.js的同样的问题的人。

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

步骤来创建一个完全工作的例子是...

这只能写入数据库的封面,其结果可以在登录到火力地堡的控制台中可以看出。

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