【问题标题】:How to get a value from Firebase Database and assign it to a value in Firebase Cloud Functions?如何从 Firebase 数据库中获取值并将其分配给 Firebase Cloud Functions 中的值?
【发布时间】:2025-12-27 19:10:16
【问题描述】:

所以我使用 firebase 作为演示应用程序的后端,我非常喜欢堆栈,但我一直在处理一个问题,我不知道如何从数据库中检索值(我有钥匙就好了)。
简而言之,我正在从一个设备发送信息,其中包含它试图访问 firebase 功能的另一台设备的“友好名称”。 函数代码如下:

exports.connectMe = functions.https.onRequest((req, res) => {
    cors(req, res, () => {
    admin.database().ref('calls/' + req.body.id + '/').set({
        target: req.body.target,
        caller: req.body.caller,
        time: req.body.time
    });

    const target = req.body.target;
    console.log(`target: ${target}`);
    const targetCall = admin.database().ref(`tokens/${target}/token`);
    console.log(targetCall);
    // const targetValue = targetCall.val();
    res.status(200).send("Thanks For The Call!");
    });    
});

变量 targetCall 正确地指向了我想要访问的数据库条目,但我无法提取我一生的价值。位于admin.database.ref 的令牌需要放在http 请求中。我如何获得价值?注释掉的代码显示了我想要存储它的变量,但我知道 .val() 不是引用方法。
作为记录,admin 在代码的前面设置为 require('firebase-admin'); .

【问题讨论】:

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


    【解决方案1】:

    您已经非常接近让数据库查询正常工作了。

    看看Firebase Documentation。它解释了如何访问结构化数据。

    exports.connectMe = functions.https.onRequest((req, res) => {
        cors(req, res, () => {
            const callRef = admin.database().ref('calls/' + req.body.id + '/').set({
                target: req.body.target,
                caller: req.body.caller,
                time: req.body.time
            });
    
            const target = req.body.target;
            console.log(`target: ${target}`);
    
            const takenRef = admin.database().ref(`tokens/${target}/token`)
                .once('value');
    
            Promise.all([callRef, takenRef])
                .then(results => {
                    const snapshot = results[1]; // Promise of `takenRef`
                    console.log(snapshot.val()); // This is the data from the database...
    
                    res.status(200).send("Thanks For The Call!");
                });
        });    
    });
    

    查看更新后的代码,我已将 .once('value').then(snapshot 添加到您的查询中,以便您访问数据。

    【讨论】:

    • 这让它按我想要的方式工作。我不明白 .once('value') 不仅仅用于初始化,感谢您清除它!
    • 别忘了在这里等待两个异步操作!您最终可能会陷入竞争状态并获得不一致的结果。 Promise.all(...) 为了胜利。
    【解决方案2】:

    您需要调用函数once(),如documentation

    targetCall.once("value", function(data) {
      const targetValue = data.val();
      res.status(200).send("Thanks For The Call!");
    });
    

    【讨论】: