Google Cloud功能并从数据库中读取数据

时间:2018-10-06 21:40:43

标签: javascript firebase-realtime-database google-cloud-functions facebook-webhooks

我正在尝试设置(Facebook)Webhook。我的数据库结构是这样的:

{ "users": [
       "1" : {"FacebookID" : "1234567"},
       "2" : {"FacebookID" : "9876554"}
]}

我将网络挂钩的代码减少到最少,以显示我的问题所在。我遍历了请求中的所有条目,并检查了哪些uid进行了更改。在更改数据之前,我想查看具有ID的用户在数据库中是否可用。 Facebook当然会向我发送FacebookID,因此,我需要检查是否存在具有该特定Facebook ID的用户帐户。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.webhooks = functions.https.onRequest((req, res) => {

    var i = 0;
    for (i = 0; i < req.body.entry.length; i++)
    {
        //strCurrentUser = req.body.entry[i].uid;
        strCurrentUser = "2357295025722342"; //For debug

        if (checkIfUserAvailable(strCurrentUser))
        {
            console.log("User is available " + strCurrentUser);
        }
        else 
        {
            console.log("User is not available " + strCurrentUser);
        }
    }

    return res.send(200);
});

function checkIfUserAvailable(userFacebookID)
{
    const rootRef = admin.database().ref();

    return rootRef.child('users').orderByChild('FacebookID').equalTo(userFacebookID).once('value').then( snap =>
    { 
        console.log("snap is : " + (snap.val() !== null));
        return (snap.val() !== null);
    });
}

现在的问题是,checkIfUserAvailable始终返回true,并且不等读取完成后返回正确的布尔值。我如何确保它等待返回,直到读取完成才能使整个代码正常工作?

我得到的结果是:

11:34:58.057 PM / webhooks / snap is : false
11:34:31.665 PM / webhooks / Function execution took 1880 ms, finished with status code: 200
11:34:31.569 PM / webhooks / User is available 2357295025722342
11:34:29.786 PM / webhooks / Function execution started

如您所见,res.send(200)较早被触发,快照为:false将在以后记录。 (我也不知道为什么要花20秒从几乎空的数据库中读取数据)

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您没有正确使用Promise。对once()的调用是异步的,并在查询完成之前立即返回。这意味着将在查询完成之前发送响应,然后Cloud Functions将关闭该异步工作。相反,您应该仅在查询完成后发送该响应。

您可能想看我的videos on using promises in Cloud Functions,以了解如何最好地应对这种情况。另外,请确保您了解documentation