Firebase Google云功能 - 数据库触发器 - 如何删除额外的记录&文件编程

时间:2017-11-21 20:57:12

标签: firebase google-cloud-firestore

使用案例

用户可以使用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;
 };

1 个答案:

答案 0 :(得分:0)

来自Bob Snydercomment

  

您正在执行的查询,设置和删除操作是异步的,并返回Promise。您需要将它们链接在一起并返回Promise the result of the Cloud Function trigger。你似乎没有这样做