编写firebase云函数时遇到的问题,该函数在满足某些条件时删除集合中的文档



我有一个ProductDatabase集合,它存储了我在应用程序上显示的所有产品。集合中的每个文档都有一个名为'SBD'的时间戳字段,它代表每个项目的销售日期。我已经创建并上传了一个云功能,它每2小时检查数据库中的每个项目,以检查每个项目的SBD字段是否没有通过。下面是函数:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
exports.delete = functions
.region("europe-west2")
.pubsub.schedule("every 2 hours").onRun((context) => {
const productsRef = admin.firestore().collection("TestDatabase");
const query = productsRef.where("SBD", "<", Date.now());
return query.get()
.then((querySnapshot) => {
const batch = admin.firestore().batch();
querySnapshot.forEach((doc) => {
batch.delete(doc.ref);
});
return batch.commit();
});
});

这个程序上传出现在firebase cloud functions控制台,并说它每2小时被调用一次,但是没有产品从TestDatabase中删除,即使它们都应该被删除。js文件存储在具有所有必要权限的google云控制台的桶中。数据库和云功能也在同一区域。

问题是您正在对SBD字段进行无效的比较。如果SBDTimestamp对象,那么您的查询必须在比较中使用Timestamp对象。

这是一个无效的比较,将始终返回0条记录,因为您不能比较两个不同的对象类型:

const query = productsRef.where("SBD", "<", Date.now());

这是通过获取UNIX时间并将其转换为Timestamp来执行的有效比较:

const seconds = Math.floor(Date.now() / 1000)
const nanoseconds = 0
const now = new Timestamp(seconds, nanoseconds)
const query = productsRef.where("SBD", "<", now);

您可以在如何比较firebase时间戳?阅读更多内容。

最新更新