问题描述
我正在尝试从数据库中读取数据,然后通过Twilio发送消息。 我期望此功能要做的是每分钟检查一次数据库。它将检查玩家集合中的所有文档。如果这些文档之一中的session字段等于0,则它将创建一条消息并将其发送到同一文档中的电话号码。
这是我当前的代码:
const account = '***********************************';
const auth = '********************************';
const client = require('twilio')(account,auth);
const firebaseFunc = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const database = admin.firestore()
exports.paymentChecker = firebaseFunc.pubsub.schedule('* * * * *').onRun((context) => {
database.collection('Players').get()
.then(querySnapshot => {
querySnapshot.forEach(doc => {
if(doc.data().sessions,'==',0){
client.messages.create({
to: doc.data().phone,from: '+***********',body: 'Hi' + doc.data().First + ',you have to renew your registration',})
}
})
}).catch()
})
但是,此代码未部署到Firebase,因为它会产生许多错误。
19:5 error Expected catch() or return promise/catch-or-return
20:11 error Each then() should return a value or throw promise/always-return
22:16 error Unexpected constant condition no-constant-condition
该如何解决? 谢谢
解决方法
问题来自以下事实:您没有返回异步方法(get()
和client.messages.create()
)返回的Promises。除了其产生的代码错误以外,请参见doc,以了解其重要性的更多详细信息。
因此,以下方法可以达到目的(未经测试):
exports.paymentChecker = firebaseFunc.pubsub.schedule('* * * * *').onRun((context) => {
return database.collection('Players').get()
.then(querySnapshot => {
const promises = [];
querySnapshot.forEach(doc => {
if (doc.data().sessions == 0) {
promises.push(
client.messages.create({
to: doc.data().phone,from: '+***********',body: 'Hi' + doc.data().First + ',you have to renew your registration',})
);
}
})
return Promise.all(promises);
}).catch(error => {
console.log(error);
return null;
})
});
还要注意,if(doc.data().sessions,'==',0)
无法正常工作。像其他错误一样,您可以通过注意相应错误行开头的行号22:16 error Unexpected constant condition no-constant-condition
来检测到它。
通过查看您共享的错误,似乎它与Promise返回有关。承诺仅仅是一项可能尚未完成的任务。您可以查看此博客文章[1],其中用示例解释了承诺。我希望这将有助于找出问题所在。
[1] https://firebase.googleblog.com/2016/01/keeping-our-promises-and-callbacks_76.html