javascript - 在 Cloud Function 中按时间戳从 Cloud Firestore 查询

标签 javascript firebase google-cloud-firestore google-cloud-functions

我编写了一个脚本,可以按时间戳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()

为了按时间戳删除旧事件?

谢谢!!!

最佳答案

您正在并行调用多个异步任务(即通过 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 云函数时,new Date().getTime() 的值将为 now。因此,我假设您有一些文档的 timeStamp 值是 future 的,否则您很可能会删除整个集合!

<小时/>

另请注意,如果您确定查询将返回少于 500 个文档,则可以使用 batched write .

关于javascript - 在 Cloud Function 中按时间戳从 Cloud Firestore 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55811380/

相关文章:

flutter - 在 flutter 中使用 StreamBuilder 时将数据传递到下一个屏幕

javascript - 不使用 <form> 将图像上传到 Node.JS 服务器

javascript - 提取匹配的文本及其相邻上下文 n 个词上游 n 个词下游(左起第 n 次出现和右起第 n 次出现)

javascript - ajax调用后如何停止刷新页面?

javascript - Phonegap 构建 cordova.js

swift - 在继续功能之前等待图像上传 - Swift 5 Firebase Storage

android - RecyclerView 绑定(bind)到 FirebaseRecyclerAdapter,选中复选框时删除了错误的行

angular - Fork 加入两个 firebase observable

node.js - GCP 上的微服务

Firebase Firestore 分离监听器不起作用