#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 документов, вы можете использовать пакетную запись.