Запрос из облачного хранилища по метке времени в облачной функции

#javascript #firebase #google-cloud-firestore #google-cloud-functions

#javascript #firebase #google-cloud-firestore #google-cloud-функции

Вопрос:

Я пишу скрипт, который удаляет события из облачного хранилища Firestore по временной метке. Скрипт, запускаемый по ссылке в облачной функции.

 'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
var db;
var count = 0;

exports.removeOldEvents = functions.https.onRequest(async(req, res) => {
     db = admin.firestore();
     db.collection("Events")
     .where("timeStamp", "<", new Date())
     .get().then(function(querySnapshot) {
          count = querySnapshot.size;
          querySnapshot.forEach(function(doc) {
               db.collection("Events").doc(doc.id).delete();
               if (--count == 0) {
                    console.log("Successful ");
                    res.send("Successful ");
                    res.end();
               }
          });
     }).catch(function(error) {
          console.log("Error ", error);
          res.send("Error ", error);
     });

 });
  

Что мне нужно написать вместе:

 new Date()
  

чтобы удалить старые события по временной метке?

Спасибо!!!

Комментарии:

1. Каков ваш точный вопрос?

2. Как удалить старое событие по временной метке?

Ответ №1:

Вы вызываете параллельно несколько асинхронных задач (т. Е. С помощью delete() метода), и вы должны отправить ответ только тогда, когда все эти задачи будут выполнены.

Поскольку delete() метод возвращает обещание, вам нужно использовать Promise.all() следующим образом:

 ....
exports.removeOldEvents = functions.https.onRequest((req, res) => {
  db = admin.firestore();
  db.collection('Events')
    .where('timeStamp', '<', new Date())
    .get()
    .then(querySnapshot => {
      var promises = [];
      querySnapshot.forEach(doc => {
        promises.push(
          db
            .collection('Events')
            .doc(doc.id)
            .delete()
        );
      });
      return Promise.all(promises);
    })
    .then(() => {
      console.log('Successful');
      res.send('Successful');
    })
    .catch(error => {
      console.log('Error ', error);
      res.status(500).send('Error ', error);
    });
});
  

Обратите внимание, что при вызове этой облачной функции HTTPS значение new Date().getTime() будет равно now. Итак, я делаю предположение, что у вас есть некоторые документы со timeStamp значением, которое будет в будущем, или вы, скорее всего, удалите всю коллекцию!


Также обратите внимание, что если вы уверены, что ваш запрос вернет менее 500 документов, вы можете использовать пакетную запись.