Загрузка файлов Firebase Storage перестает работать через некоторое время - PullRequest
1 голос
/ 16 января 2020

У меня установлен простой триггер при загрузке файлов в Firebase. Он читает загруженный файл, обрабатывает его и сохраняет результаты в базу данных. Работает какое-то время, после этого вылетает и перестает работать. Обычно помогает функция загрузки. У кого-нибудь есть идея, в чем может быть причина? Мне не хватает памяти или ...?

Вот код:

const {Storage} = require('@google-cloud/storage');
const path = require('path');
const storage = new Storage();

exports.processLogs = functions
.region('europe-west1')
.storage
.object()
.onFinalize(async (object) => {


    const filename = path.basename(object.name);
    const bucket = storage.bucket(object.bucket);


    try {
        await bucket.file(filename).download(async (err, contents) => {
               if (err) {
                        console.log('error', err);
                        return null
               }

               //Proces file and store into db
               // (...)

               bucket.file(filename).delete();

        });
    } catch(e){
            console.log('error',e)
    }

});

Ошибка, которую я получаю:

Анонимный абонент не иметь storage.objects.get доступ к project-name.appspot.com/CrTwBuyNR2-log-2020-1-16-12-18.csv. '

спасибо

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Поскольку вы используете Firebase, я рекомендую инициализировать корзину с firebase-admin вместо @google-cloud/storage напрямую. Это позволит отсортировать разрешения так, что правила безопасности будут пропущены.

В вашем коде вы также неправильно смешали функции обратного вызова и async / await API. Поскольку этот код выполняется в облачной функции, я рекомендую использовать исключительно Promises и async / await.

. Приведенный ниже код переписан со следующими изменениями:

  • Код был разбит на логические блоки
  • Не используется API обратного вызова (см. File#download)
  • Каждый блок будет регистрировать и выдавать ошибки отдельно для упрощения отладки
  • Однострочные сообщения журнала (т. Е. Без трассировки стека)
  • Оставляет полную регистрацию ошибок в облачных функциях (упрощает поиск ошибочных запусков)
const admin = require('firebase-admin');
const functions = require('firebase-functions');

admin.initializeApp();

exports.processLogs = functions.region('europe-west1').storage.object()
  .onFinalize(async (object) => {

    const bucketRef = admin.storage().bucket(object.bucket);
    const fileRef = bucketRef.file(object.name);

    console.log('Processing "' + object.id + '"...');

    // 1) DOWNLOAD
    let [contents] = await fileRef.download()
      .catch((err) => {
        console.log('DOWNLOAD FAILED: ', (err.code ? err.code + ': ' : '') + err.message);
        throw err;
      });

    // 2) PARSE
    let dataToUpload = {};
    try {
      // Transform file contents
      dataToUpload = JSON.parse(contents);
    } catch (err) {
      console.log('PARSE FAILED: ', (err.code ? err.code + ': ' : '') + err.message);
      throw err;
    }

    // 3) DATABASE SET
    const dbRef = admin.database().ref('path/to/data');
    await dbRef.set(dataToUpload)
      .catch((err) => {
        console.log('DATABASE SET FAILED: ', (err.code ? err.code + ': ' : '') + err.message);
        throw err;
      });

    // 4) CLEANUP
    await fileRef.delete()
      .catch((err) => {
        console.log('CLEANUP FAILED: ', (err.code ? err.code + ': ' : '') + err.message);
        throw err;
      });

    // 5) LOG SUCCESS
    console.log('SUCCEEDED');
  });

Приведенные выше сообщения журнала могут также при желании можно включить в вспомогательную функцию:

function logAndRethrowError(err, name) {
  console.log((name || 'ERROR') + ': ', ((err.code ? err.code + ': ' : '') + err.message) || err);
  throw err;
}

// Usage:
let [contents] = await fileRef.download()
  .catch(err => logAndRethrowError(err, 'DOWNLOAD FAILED'));

try {
  // ...
} catch (err) { logAndRethrowError(err, 'PARSE FAILED') }
0 голосов
/ 16 января 2020

Похоже, проблема в том, что правила безопасности установлены неправильно? Пожалуйста, попробуйте этот документ или видео .

Для начала попробуйте это:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

И если это окажется успешным, правильно установите правила хранения.

...