我写了一个脚本,该脚本在时间戳之前从 Cloud Firestore 中删除了事件。由 Cloud Function 中的链接运行的脚本。
'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删除旧事件?
谢谢!
答案 0 :(得分:1)
您正在并行调用多个异步任务(即通过delete()
方法),并且只有在所有这些任务完成后才应发回响应。
由于delete()
方法返回了Promise,因此您需要使用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 Cloud Function时,new Date().getTime()
的值将为现在。因此,我假设您有一些将来带有timeStamp
值的文档,否则您很可能会删除整个集合!
还请注意,如果您确定查询返回的文档少于500个,则可以使用batched write。