Как запланировать пакетное обновление коллекции в моей базе данных Firebase Firestore с помощью облачных функций? - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в JS и облачных функциях, и я хотел бы выполнять обновление коллекции в моей базе данных Firestore каждый день в полночь. У меня есть коллекция appointmentTimes с логическим полем available, и я хочу сбрасывать его до true каждый день в полночь. До сих пор я пробовал использовать следующее:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.resetAppointmentTimes = functions.pubsub.schedule('0 0 * * *').onRun((context) => {
    const appointmentTimesCollectionRef = db.database().collection('appointmentTimes');
    appointmentTimesCollectionRef.get().then(querySnapshot => {
        if (querySnapshot.empty) {
            return null;
        } else {
            let batch = db.database().batch();
            querySnapshot.forEach(doc => {
                batch.update(doc.ref, { available: true });
            });
            return batch.commit();
        }
    }).catch(error => { console.log(error); });
})

Спасибо за любой ввод / предложения!

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Непонятно, что такое db.database(). Вам следует использовать Admin SDK и позвонить по номеру admin.firestore(), чтобы получить экземпляр приложения Firebase. Кроме того, вам необходимо вернуть цепочку Promises (посмотрите 3 видео о «JavaScript Promises» из серии видео Firebase: https://firebase.google.com/docs/functions/video-series/, чтобы узнать больше).

Следующее должно сделать трюк:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

const db = admin.firestore();

exports.resetAppointmentTimes = functions.pubsub.schedule('0 0 * * *').onRun((context) => {
    const appointmentTimesCollectionRef = db.collection('appointmentTimes');
    return appointmentTimesCollectionRef.get()  // See the return here
    .then(querySnapshot => {
        if (querySnapshot.empty) {
            return null;
        } else {
            let batch = db.batch();
            querySnapshot.forEach(doc => {
                batch.update(doc.ref, { available: true });
            });
            return batch.commit();
        }
    })
    .catch(error => { 
        console.log(error); 
        return null;
    });
})
0 голосов
/ 18 июня 2020

Вы можете использовать node-schedule как файл cron

var schedule = require('node-schedule');

var j = schedule.scheduleJob('0 0 0 * * *', function(){
    const appointmentTimesCollectionRef = db.database().collection('appointmentTimes');
appointmentTimesCollectionRef.get().then(querySnapshot => {
    if (querySnapshot.empty) {
        return null;
    } else {
        let batch = db.database().batch();
        querySnapshot.forEach(doc => {
            batch.update(doc.ref, { available: true });
        });
        return batch.commit();
    }
}).catch(error => { console.log(error); });
});
...