[英]What could this be about? [TsLint Error: “Promises must be handled appropriately”]
[英]Firebase functions tslint error Promises must be handled appropriately
我正在使用TypeScript编写一个firebase函数来向多个用户发送推送通知。 但是当我运行firebase deploy --only functions
命令时,TSLint会给出错误“必须正确处理Promise”。
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);
})
});
首先,我认为你最好使用可调用函数而不是onRequest。 请参阅: 可调用云功能是否优于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',我在这里使用它来将文档数组转换为一系列的承诺。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.