如何创建计划的功能以从Firebase读取数据,然后在twilio上发送消息

问题描述

我正在尝试从数据库中读取数据,然后通过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