Облачная функция Firebase без console.log при вызове admin.firestore () - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть веб-крючок для получения событий мессенджера Facebook в облачной функции, например:

export const facebookMessengerHook = functions.https.onRequest(async (req: express.Request, res: express.Response) => {
    console.log(req);
    console.log(req.method);
    console.log(req.body);
    if (req.method == "POST") {
        const body = req.body;

        console.log(body);
        // Checks this is an event from a page subscription
        if (body.object === 'page') {
            res.status(200).send('EVENT_RECEIVED');

            // Iterates over each entry - there may be multiple if batched
            for (const entry of body.entry) {
                // will only ever contain one message, so we get index 0
                const webhook_data = entry.messaging[0];

                console.log(webhook_data);
                try {
                    // v THAT PART HERE v
                    const user = await admin.firestore().collection('users')
                        .where('facebookMessengerId', '==', webhook_data.sender.id)
                        .get();
                    // ^ THAT PART HERE ^
                    console.log(user);
                } catch (e) {
                    console.log('No user');
                }
            }
        }
        else {
            // Returns a '404 Not Found' if event is not from a page subscription
            res.sendStatus(404);
        }
    }
});

Он ничего не регистрирует, если я не закомментирую отмеченную часть во фрагменте.

Может кто-нибудь объяснить мне, почему и как это исправить, потому что мне нужно позвонить в firestore и мне также нужен console.log для отладки?

Спасибо за любую помощь!

1 Ответ

1 голос
/ 07 ноября 2019

Скорее всего, проблема связана с тем, что, делая

res.status(200).send('EVENT_RECEIVED');

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

Поэтому вы должны изменить свой код следующим образом:

    //....
    if (body.object === 'page') {


        // Iterates over each entry - there may be multiple if batched
        for (const entry of body.entry) {
            // will only ever contain one message, so we get index 0
            const webhook_data = entry.messaging[0];

            console.log(webhook_data);
            try {

                const user = await admin.firestore().collection('users')
                    .where('facebookMessengerId', '==', webhook_data.sender.id)
                    .get();

                console.log(user);


            } catch (e) {
                console.log('No user');
                //Here throw an error to be catched at an upper level
            }
        }

        res.status(200).send('EVENT_RECEIVED');
    }
    //....

Примечаниечто вы можете использовать Promise.all(), поскольку вы выполняете серию выборок для базы данных. Но с вашим кодом это невозможно подтвердить, поскольку он не показывает точное использование этих выборок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...