首页 > 解决方案 > 如何创建从 Firebase 读取数据然后在 twilio 上发送消息的计划函数

问题描述

我正在尝试从我的数据库中读取数据,然后通过 Twilio 发送消息。我期望这个函数做的是每分钟检查一次数据库。它将检查玩家集合中的所有文档。如果其中一个文档中的会话字段等于 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

如何解决这个问题?谢谢

标签: javascriptfirebasegoogle-cloud-functionstwilio

解决方案


问题在于您没有返回异步方法(get()client.messages.create())返回的 Promises。除了它生成的代码错误之外,有关它的重要性的更多详细信息,请参阅文档。

所以下面应该做的伎俩(未经测试):

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


推荐阅读