Firebase 函数 tslint 错误 必须正确处理承诺

Posted

技术标签:

【中文标题】Firebase 函数 tslint 错误 必须正确处理承诺【英文标题】:Firebase functions tslint error Promises must be handled appropriately 【发布时间】:2019-08-21 08:33:30 【问题描述】:

我正在使用 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);
    )
);

【问题讨论】:

您忽略了从 sendToDevice 返回的承诺。 我也试过在sendToDevice函数后添加catch然后阻塞,还是报错。 也许您可以编辑问题以显示该代码?你现在展示的肯定是不对的。 请同时包含您的 TSLint 和 TypeScript 版本以及 TSLint 抱怨的哪一行(以便我们知道您发布的代码中的哪一行)。 【参考方案1】:

首先要说一句,我认为您最好使用可调用函数而不是 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”将文档转换为一组承诺。

【讨论】:

以上是关于Firebase 函数 tslint 错误 必须正确处理承诺的主要内容,如果未能解决你的问题,请参考以下文章

Typescript:更新 Firebase 函数依赖项时出现编译错误

TSLint:forIn 循环必须被过滤

Firebase 类型和具有默认 tslint.json 的无隐式依赖项

返回承诺的函数必须是异步的

如何检查传递给函数的参数数量是不是错误

云函数错误:函数不是有效的特性。必须是数据库、firestore、函数、托管、存储之一[关闭]