我是使用Firebase函数的新手。
7天后(以时间戳计算),我想从数据库中删除“帖子”节点,然后,从“评论”和“反应”中删除所有引用该帖子的节点。之后,如果帖子的photoVideoPath是Firebase Storage的引用,我想从我的存储中删除该对象。
我的数据库结构是:
Post: {
PostKey: {
date: xx/xx/xxxx
timestamp: xxxxxxxx
photoVideoPath: xxxxxxxxxx
title: xxxxxxxxxxx
}
[...]
}
Comment: {
PostKey: {
date: xx/xx/xx
hours: xx:xx
user: idUser
text: xxxxxxxxxx
}
[...]
}
Reaction: {
PostKey: {
type: xxxxxx
user: idUser
}
[...]
}
我写的代码是:
exports.deleteOldItems = functions.database.ref('/Post/{pushId}').onWrite((change) => {
const ref = change.after.ref.parent; // reference to the parent
const now = Date.now();
const cutoff = now - CUT_OFF_TIME;
ref.orderByChild('timestamp').endAt(cutoff).once('value', res => {
// create a map with all children that need to be removed
const updates = {};
res.forEach(child => {
updates[child.key] = null;
});
ref.update(updates);
functions.database.ref('/Reaction/').child(res.key).remove();
functions.database.ref('/Comment/').child(res.key).remove();
if (!res.val().photoVideoPath.startsWith("data:image/") && !res.val().photoVideoPath.startsWith("http")) {
const filePath = res.val().title + res.val().data.replace("/", "").replace("/", "") + res.val().photoVideoPath
const bucket = googleCloudStorage.bucket('xxxxxxx.appspot.com')
const file = bucket.file(filePath)
file.delete().then(() => {
return console.log(`Successfully deleted photo`)
}).catch(err => {
return console.log(`Failed to remove photo, error: ${err}`)
});
}
});
});
我在做什么错?谢谢大家,祝你有美好的一天
答案 0 :(得分:0)
您不会关注update()和remove()返回的承诺。另外,您不能正确使用delete()返回的promise。实时数据库触发器函数必须返回一个仅在函数中的所有其他异步工作完成后才能解决的承诺。
要了解有关如何将诺言与Cloud Functions结合使用的更多信息,请考虑遵循此处的教程:https://firebase.google.com/docs/functions/video-series/