Firebase功能tslint错误必须正确处理承诺

时间:2019-03-30 17:00:49

标签: typescript firebase google-cloud-functions tslint

我正在使用TypeScript编写firebase函数,以将推送通知发送给多个用户。但是当我运行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 :(得分:0)

首先,我认为您最好使用可调用函数而不是onRequest。 参见:Are Callable Cloud Functions better than HTTP functions?

接下来,您需要等待异步功能完成,然后再发送回响应。

在这种情况下,您要遍历查询返回的所有文档。对于每个文档,请调用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”,我在这里使用了该函数来转换数组将文档分成一系列的承诺。