Во-первых, я думаю, что вам лучше использовать вызываемую функцию вместо onRequest.
См .: Функции Callable Cloud лучше, чем функции HTTP?
Далее необходимо дождаться завершения асинхронных функций перед отправкой ответа.
В этом случае вы просматриваете все свои документы, возвращенные по запросу. Для каждого документа вы вызываете sendToDevice. Это означает, что вы выполняете несколько асинхронных функций параллельно.
Вы можете использовать:
Promise.all([asyncFunction1, asyncFunction2, ...]).then(() => {
response.send(`Broadcasted to ${snapshot.docs.length} users.`);
});
Следующий код не проверен:
export const broadcastJob = functions.https.onRequest((request, response) => {
const db = admin.firestore();
db.collection('profiles').get().then(snapshot => {
Promise.all(snapshot.docs.map(doc => {
const deviceToken = doc.data()['deviceToken'];
return admin.messaging().sendToDevice(deviceToken, {
notification: {
title: 'Notification',
body: 'You have a new notification'
}
});
})).then(() => {
response.send(`Broadcasted to ${snapshot.docs.length} users.`);
}
}).catch(reason => {
response.send(reason);
})
});
Обратите внимание, что я не использую функцию snapshot.forEach.
Вместо этого я предпочитаю использовать свойство snapshot.docs, которое содержит массив всех документов, возвращаемых запросом, и предоставляет все обычные функции массива, такие как «forEach», но также и «map», которые я использовал здесь для преобразования массива. документов в массив обещаний.