Скорее всего, проблема связана с тем, что, делая
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()
, поскольку вы выполняете серию выборок для базы данных. Но с вашим кодом это невозможно подтвердить, поскольку он не показывает точное использование этих выборок.