如何从Firebase数据库获取值并将其分配给Firebase云功能中的值?

时间:2017-09-11 23:30:22

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

所以我使用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正确指向我想要访问的db条目,但是我无法提取我的生命值。位于admin.database.ref的令牌需要放在http请求中。我如何获得价值?注释掉的代码显示了我想要存储的变量,但我知道.val()不是引用的方法。
为了记录,admin设置为require('firebase-admin');在代码的早期。

2 个答案:

答案 0 :(得分:2)

您需要调用documentation中的函数once()

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

答案 1 :(得分:2)

您非常接近使数据库查询正常工作。

看看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添加到您的查询中,您可以访问该数据。