如何在节点js中的函数内运行Firebase查询

时间:2018-08-20 12:13:16

标签: firebase asynchronous firebase-realtime-database google-cloud-functions

我有一个应该查询firebase db并返回结果的函数。

 function verifyToken(token)
 {
    var androidId = 'xxxxx';
    admin.database(dbDEV).ref('profiles').orderByChild('androidId').equalTo(androidId).on('value',(snapshot)=>{
    console.log(snapshot.val());
    return snapshot.val();
   });
 }

我正在为此使用firebase函数。因此结果正在Firebase日志中记录,但是执行功能时我没有获取并返回值。

2 个答案:

答案 0 :(得分:0)

两件事:

  • 使用一次()代替on()一次查询数据。 on()建立一个永久监听的监听器,直到您删除该监听器为止。

  • 实时数据库查询都是异步的,这意味着它们将立即返回,并且稍后提供的回调函数将与结果一起调用。您不能简单地从回调中返回结果以从封闭函数中返回这些结果。如果希望verifyToken将查询结果提供给调用方,则应返回一个可以解决数据的Promise。

答案 1 :(得分:0)

您可以从使用诺言开始。例如:

function verifyToken(token) {
    return new Promise(resolve => {
        var androidId = 'xxxxx';
        admin.database(dbDEV).ref('profiles').orderByChild('androidId').equalTo(androidId).on('value',(snapshot)=>{
            console.log(snapshot.val());
            resolve(snapshot.val());
        });
    });
}

当您需要结果时:

verifyToken(token).then(result => {
    ... do stuff
});

要对此进行改进,可以使用异步功能。例如:

async function foo() {
    const result = await verifyToken(token);
    console.log(result);
}