Как получить доступ к глубокому значению БД в реальном времени с помощью функции облака? - PullRequest
0 голосов
/ 01 мая 2019

В childSnapshot.val().k У меня это с облачной функцией:

{ '-LdmZIlKZh3O9cR8MOBU': 
   { id: 'ceccomcpmoepincin3ipwc',
     k: 'test',
     p: 'somepath',
     t: 1556700282278,
     u: 'username' },
 '-Llkocp3ojmrpemcpo3mc': 
   { id: '[epc[3pc[3m,',
     k: 'test2',
     p: 'somepath2',
     t: 1556700292290,
     u: 'username2' }
 }

Мне нужно каждое значение пути, чтобы я мог удалить этот файл из хранилища.Как получить доступ к этому значению?

Моя функция облака для обновления состояний, удаления и удаления файлов из хранилища:

var db = admin.database();

var ref = db.ref('someref');

ref.once("value").then((snapshot) => {
var updates = {};

var patObject = {
    fid: null,
    ft: null,
    ftr: null,
    fu: null,
    id: null,
    lid: null,
    lt: null,
    ltr: null,
    lu: null,
    t: null,
    tr: null,
    v: null,
    g: null,
    l: null,
    k: null
    };

    snapshot.forEach((childSnapshot) => {
        if(childSnapshot.numChildren() >= 14){
                var t = childSnapshot.val().t;

            if((t===1 || t===5) && childSnapshot.val().tr > 0) {
                if(childSnapshot.val().tr - 12 > 0){
                    updates[childSnapshot.key + '/tr'] = childSnapshot.val().tr - 12;

            if(childSnapshot.val().k !== ""){

              console.log('path: ', childSnapshot.val().k);

              childSnapshot.val().k.snapshot.forEach(kpath => {
                console.log('path: ', "path");
              });
            }
                } else {
                    updates[childSnapshot.key] = patObject;
                }
            }

            if(childSnapshot.val().tr<=0){
                updates[childSnapshot.key] = patObject;
            }
        } else {
            updates[childSnapshot.key] = patObject;
        }
  });

    ref.update(updates);

    res.send("");   

    return "";
}).catch(reason => {
    res.send(reason);
})

return "";  

1 Ответ

1 голос
/ 01 мая 2019

Если вы хотите удалить все файлы, соответствующие значениям p s, вам необходимо использовать Promise.all() для параллельного выполнения асинхронных задач удаления (поскольку delete() метод возвращает обещание).Вам нужно перебрать объект, который содержит p путей.

Не так просто понять ваш код, поэтому вы найдете ниже часть, соответствующую приведенным выше объяснениям.Вы можете интегрировать его в свой код!

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const defaultStorage = admin.storage();  //Note this line

//.....

exports.date = functions.https.onRequest((req, res) => { //I understand that you use an HTTP Cloud Function

   //....

   .then(...

       // Somehow you get the object you mention in your question, through childSnapshot.val().k

        const kObject = childSnapshot.val().k;

        const bucket = defaultStorage.bucket(yourFileBucket);

        const promises = [];

        Object.keys(kObject).forEach(
          //The values of the path p are obtained via kObject[key].p
          //Based on that we push the Promise returned by delete() to the promises array
          promises.push(bucket.file(kObject[key].p).delete());        
        );

        return Promise.all(promises)   
    .then(results => {
        //Here all the Promises that were in the promises array are resolved, which means that all the files are deleted
        res.send({result: results.length + ' files(s) deleted'});
    })
    .catch(error => {
        res.status(500).send(error);
    });


});

Смотреть может быть интересно, посмотрев следующее официальное видео Firebase Дуга Стивенсона: https://youtu.be/7IkUgCLr5oA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...