如何使用firebase云功能删除多个路径



我想删除超过15天的数据。我可以同时查询和删除多个目录吗?

数据库结构如下。有多种语言和类型。

{
"hr" : {
"classic" : {
"finish" : {
"-MuJD4oAlQ42TkdfKW5M" : {
"gid" : "LlAHMyj",
"ts" : 6.652890289073215E8
}
}
},
"duel" : {
"finish" : {
"-MuJD4o9LONeayt4ACMC" : {
"gid" : "rfePU2x",
"ts" : 6.652890289073215E8
}
}
},
"target" : {
"finish" : {
"-MuJD4o9LONeayt4ACMD" : {
"gid" : "FBz4H_4",
"ts" : 6.652890289073215E8
}
}
}
},
"nl" : {
"target" : {
"finish" : {
"-MuJD4oAlQ42TkdfKW5L" : {
"gid" : "sv3pRfC",
"ts" : 6.652890289073215E8
}
}
}
}
}

我试着用下面的代码来做,但它总是返回null。

exports.deleteOldData = function (snap, context) {
const end = new Date(new Date().setDate(new Date().getDate() - 15));
const endDate = toSwiftDate(end);
database.ref("/matchTour/{language}/{type}/finish/").orderByChild("ts").endAt(endDate).transaction(function (info) {
if (info === null) return info;
console.log("matchTour 3", JSON.stringify(info.val()));
return null;
}).catch((error) => {
console.log("error);
});
};

您不能在查询上运行事务。事实上,从Query的参考文档来看,这甚至不应该编译。

这应该更接近:

exports.deleteOldData = function (snap, context) {
const end = new Date(new Date().setDate(new Date().getDate() - 15));
const endDate = toSwiftDate(end);
const ref = database.ref("/matchTour/{language}/{type}/finish/");
return ref
.orderByChild("ts").endAt(endDate)
.once("value")
.then((results) => {
let updates = {};
results.forEach((snapshot) => {
updates[snapshot.key] = null;
});
return ref.update(updates);
}).catch((error) => {
console.error(error);
});
};

上面的操作从数据中读取查询结果,执行单个多路径更新以删除所有结果,并确保异步读写气泡所返回的promise,这样您的函数容器就不会过早终止。


这就留下了languagetypedatabase.ref("/matchTour/{language}/{type}/finish/")中是什么的问题。如果要有来自上下文的变量,那么您需要对以下字符串使用backticks:

database.ref(`/matchTour/{language}/{type}/finish/`)

总之,这段代码中有很多错误,这让我认为您可能还不太适应编写服务器端JavaScript。如果是这样的话,编写云函数并不是最简单的入门方法,我建议首先在客户端JavaScript环境中编写相同的代码,比如本地node.js脚本,甚至网页。

阅读Web开发人员的Firebase文档和/或为Web开发人员学习Firebase代码实验室是很好的起点。

最新更新