我要做的是运行一个作业,在特定的时间,它将从我的文档中提取特定的字段,并使用提取的内容向用户发送通知。
但问题是通知正文仍然是空的。我试着记录我从文档中获取的内容是否为空。但根据日志,引号变量不是空的。
请告诉我我缺少什么
exports.sendDailyQuotes = functions.pubsub.schedule('0 7 * * *').timeZone('Asia/Kolkata').onRun(async (context) => {
var today = new Date();
today.setDate(today.getDate() + 1);
var currMonth = today.getMonth() + 1;
var dateQry = today.getDate() + "-" + currMonth;
var quote;
admin.firestore().collection('quotes').doc(dateQry).get().then(snapper => {
quote = snapper.data().english;
return "";
}).catch(reason => {
console.log(reason);
});
var dailyQuote = {
notification : {
title : "Daily Quote",
body : quote, //This is staying empty
},
topic : 'notifications'
}
let response = await admin.messaging().send(dailyQuote);
console.log(response);
});
在对Firestore的调用中没有正确使用promise。调用then
不会像调用await
那样暂停代码。在等待查询完成之前,您的代码将立即转到对FCM的调用。
您应该再次使用wait来暂停代码以等待get()
的结果。
const snapper = await admin.firestore().collection('quotes').doc(dateQry).get()
quote = snapper.data().english;
如果您想在返回promise的调用中捕获错误,则应该在使用await
时使用try/catch。
我强烈建议花点时间学习如何有效地使用promise,否则在实现云函数代码时会不断遇到这样的奇怪错误。