我正在尝试设置 (Facebook) Webhook。我的数据库结构是这样的:
{ "users": [
"1" : {"FacebookID" : "1234567"},
"2" : {"FacebookID" : "9876554"}
]}
我将 webhook 的代码减少到最少,以显示我的问题所在。我浏览了请求中的所有条目并检查了哪些 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) 较早被触发,而 snap is: false 将稍后记录。(我也不确定为什么从几乎空的数据库中读取数据需要 20 秒)
谢谢您的帮助!