Функция Google Cloud и чтение данных из базы данных - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь настроить (Facebook) Webhook.Моя структура базы данных выглядит следующим образом:

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

Я сократил код для веб-крюка до минимума, чтобы показать, где у меня есть проблемы.Я просматриваю все записи из запроса и проверяю, в каком uid есть изменения.Прежде чем я хочу изменить свои данные, я бы хотел посмотреть, есть ли в моей базе данных пользователь с идентификатором.Facebook, конечно, отправляет мне FacebookID, поэтому мне нужно проверить, есть ли учетная запись пользователя с этим конкретным идентификатором Facebook.

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 и не ждет окончания чтения для возврата правильного логического значения.Как я могу убедиться, что он ожидает возврата, пока чтение не будет завершено, чтобы заставить весь код работать?

Что я получу в результате ist:

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 голосов
/ 07 октября 2018

Вы не правильно используете обещания.Вызов once() является асинхронным и возвращается непосредственно перед завершением запроса.Это означает, что ответ отправляется до выполнения запроса, и облачные функции отключают эту асинхронную работу.Вместо этого вы должны отправлять этот ответ только после завершения запроса.

Возможно, вы захотите посмотреть мои видео об использовании обещаний в облачных функциях , чтобы узнать, как лучше всего справляться с ситуациями.как это.Также убедитесь, что вы понимаете документацию .

...