Запрос из Cloud Firestore по отметке времени в Cloud Function - PullRequest
0 голосов
/ 23 апреля 2019

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

'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()

чтобы удалить старые события по методу timeStamp?

Спасибо !!!

1 Ответ

1 голос
/ 23 апреля 2019

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

Поскольку *Метод 1006 * возвращает Обещание, вам необходимо использовать 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() будетбыть сейчас.Поэтому я предполагаю, что у вас есть некоторые документы со значением timeStamp, которые находятся в будущем, или вы, скорее всего, удалите всю коллекцию!


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...