【问题标题】:Firebase Functions (trigger) “dynamically” write/update Firebase nodeFirebase 函数(触发器)“动态”写入/更新 Firebase 节点
【发布时间】:2017-08-08 15:57:15
【问题描述】:

我想从具有四个子节点的 Firebase 节点 Games/{gid}/BoxScores 检索数据:Q1, Q2, Q3, Q4

下面是我要实现的代码;其中 qtrDesc 是对 BoxScores 中任何一个子节点的引用:Q1 or Q2 or Q3 or Q4

exports.boxScoresUpdate = functions.database.ref('/Games/{gid}/BoxScores').onWrite(event => { 

    event.data.ref.parent.child('Qtr').once('value', data => {

        console.log('Qtr is: ', data.val());

        for(let i = data.val(); i > 0; i--) {

            let qtrDesc = "Q".concat(i);

            console.log('qtrDesc: ', qtrDesc); // Outputs the desired 'Q1, Q2, Q3, Q4'

            // Outputs is "undefined" in the function logs
            console.log('Qtr Score is: ', newValue.qtrDesc); // ****Does not reference the desired child node

        }

    });

});

上面代码的问题是,Firebase 函数仪表板上的日志中的输出是 undefined,因为它试图为 qtrDesc(不存在)而不是 @987654327 获取 newValue @ 为Q1 or Q2 or Q3 or Q4 随意!?

json节点为:

"Games": {
    "12345": {
        "Date": "20170819",
        "BoxScores": {
            "Q1": "10",
            "Q2": "21",
            "Q3": "90",
            "Q4": "100"
        },
        "Qtr": "4"
     }
 }

【问题讨论】:

    标签: node.js firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    如果不查看您的数据结构,就很难确定。但我认为您正在寻找:

    event.data.ref.parent.child('Qtr').once('value', data => {
        data.forEach(quarterSnap => {
            let qtrDesc = quarterSnap.key;
            let qtrVal = quarterSnap.val();
    
            console.log(qtrDesc, qtrVal);
        }
    });
    

    如果这不是您需要的,请编辑您的问题以包含您正在使用的 JSON 结构的 sn-p(作为文本,没有屏幕截图)。您可以通过单击 Firebase Database console 中的“导出 JSON”链接来获取此信息。

    【讨论】:

    • 它不起作用,forEach 循环永远不会被调用。我更新了问题以包含 json 对象。
    • 这意味着你正在监听一个没有任何数据的节点。这是有道理的,因为我在 JSON 中并没有真正看到 Qtrevent.data.ref.parent.child('Qtr').once('value', data => { 将如何导致循环。你不是想循环event.data.val()吗?
    • event.data.val() 将(或应该)产生值 4,如上面的 json 对象所示。然后for 循环“应该”循环四次,将qtrDesc 变量更改为以下值:Q4 then Q3 then Q2 and finally Q1 正如我对"Q".concat(i) 行所期望的那样,然后我期望从newValue.qtrDesc 中读取BoxScores 节点来检索这些值:100, 90, 21, and then 10
    • 我的问题是(或看起来像)newValue.qtrDesc 正在 BoxScores 节点中寻找一个名为 qtrDesc 的节点,而不是它在 for 循环中动态变化(如我所料): newValue.Q4newValue.Q3newValue.Q2 最后是newValue.Q1
    • 啊哈...这意味着您正在寻找newValue[qtrDesc]
    【解决方案2】:
    const admin = require('firebase-admin');
    admin.initializeApp(functions.config().firebase);
    

    admin.database(); 
    

    供参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多