使用案例
用户可以使用UI(移动设备,网络)上传图片。 Firebase存储和文件的数据库记录插入在UI中完成。用户可以上传一定数量的文件,用于测试max 5.解决方案是通过Firebase存储来存储文件和Firebase数据库来跟踪图像的URL以供将来在其他屏幕中使用。
我有一个google云功能,当用户将图像上传到firebase存储时会触发该功能。上传文件后,我在uid下创建一个firebase数据库记录。谷歌云功能会触发onCreate()
。
数据库结构
Users/{uid}/images/
{ name: file1.jpg, date_created: "2017-11-01", downloadURL : "//...."}
对于每个记录创建,我检查uid/images
节点下的记录数,并检查快照是否大于MAX_LIMIT
。如果它大于MAX_LIMIT
我尝试从数据库和另一个GCF(监听.onDelete()
触发器)中删除记录,我删除了firebase存储文件。
问题是一旦记录计数超过MAX_LIMIT
...快照表现很奇怪。它迭代删除所有记录,从而触发GCF删除功能并从存储中删除所有文件。
没有GCF删除存储功能的问题..它有魅力......并且由于GCF onCreate DB功能中的代码行为而从存储中删除所有文件。
简单地说明逻辑问题的功能。
//var database = admin.database(); passed to function
exports.handler = function(event, database, esClient)
{
var usersRef = database.ref('users');
console.log('inside Backend Function1 -
checkImageCounterFunction');
console.log( 'event data =' + JSON.stringify(event.data.val()) );
console.log('event data length =' + event.data.numChildren());
console.log('event.params.uid =' + event.params.uid );
var objLength = 0;
usersRef.child(event.params.uid+'/images').once('value',
function(snapshot) {
console.log('Count: ' + snapshot.numChildren());
objLength = snapshot.numChildren();
console.log('database ref length =' + objLength);
if(objLength > 0) {
if(objLength > serverConfig.max_image_counter){
console.log('Maximum number of images upload found.
Deleting old images and records.');
var readDBPromise = new Promise(function (resolve, reject)
{
usersRef.child(event.params.uid+'/images')
.orderByChild('date_created')
.limitToFirst(objLength - serverConfig.max_image_counter)
.on("value", function(snapshot) {
console.log('snapshot.val()
=>'+JSON.stringify(snapshot.val()) );
snapshot.forEach(function(data) {
console.log('snapshot.for.data value
='+JSON.stringify(data) );
console.log('item Key = ' + data.key + ' val ='+
JSON.stringify(data.val()));
usersRef.child(event.params.uid+'/images/'+data.key)
.remove(function (error) {
if (!error)
console.log('Success - Firebase Database remove
{'+data.val().name+'}');
else
console.log('Error - Firebase Database remove
{'+data.val().name+'}');
});
});
resolve();
});
});
readDBPromise.then(function (result){
console.log('Returning from function!');
usersRef.child(event.params.uid+'/image_counter')
.set(serverConfig.max_image_counter);
return;
});
} //end if objLength > MAX
else
return usersRef.child(event.params.uid+'/image_counter')
.set(objLength);
}
else
console.log('objLength is 0 or negative = '+objLength);
return;
});
//return;
};
答案 0 :(得分:0)
您正在执行的查询,设置和删除操作是异步的,并返回Promise。您需要将它们链接在一起并返回Promise the result of the Cloud Function trigger。你似乎没有这样做