Функции Firebase Ошибка tslint Обещания должны быть обработаны соответствующим образом - PullRequest
0 голосов
/ 30 марта 2019

Я пишу функцию firebase, используя TypeScript для отправки push-уведомлений нескольким пользователям. Но когда я запускаю команду firebase deploy --only functions, TSLint выдает ошибку «Обещания должны быть обработаны соответствующим образом».

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp(functions.config().firebase);

export const broadcastJob = functions.https.onRequest((request, response) => {
    const db = admin.firestore();
    db.collection('profiles').get().then(snapshot => {
        snapshot.forEach(doc => {
            const deviceToken = doc.data()['deviceToken'];
            admin.messaging().sendToDevice(deviceToken, { //<-- Error on this line
                notification: {
                    title: 'Notification',
                    body: 'You have a new notification'
                }
            });
        });
        response.send(`Broadcasted to ${snapshot.docs.length} users.`);
    }).catch(reason => {
        response.send(reason);
    })
});

1 Ответ

0 голосов
/ 27 июня 2019

Во-первых, я думаю, что вам лучше использовать вызываемую функцию вместо 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», которые я использовал здесь для преобразования массива. документов в массив обещаний.

...