首页 文章

Firebase Google Cloud 功能 - 数据库触发器 - 如何以编程方式删除额外的记录和文件

提问于
浏览
0

Use case:

用户可以使用UI(移动,网络)上传图像 . Firebase存储和文件的数据库记录插入在UI中完成 . 用户可以上传一定数量的文件,用于测试max 5.解决方案是通过Firebase存储来存储文件和Firebase数据库来跟踪图像的URL以供将来在其他屏幕中使用 .

我有一个谷歌 Cloud 功能,当用户将前端图像上传到firebase存储时会触发该功能 . 上传文件后,我在uid下创建一个firebase数据库记录 . 谷歌 Cloud 功能触发 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

    来自Bob Snydercomment

    您正在执行的查询,设置和删除操作是异步的,并返回Promise . 您需要将它们链接在一起并返回Promise作为Cloud Function触发器的结果 . 你似乎没有这样做

相关问题