Firebase存储文件下载将在一段时间后停止工作

问题描述 投票:1回答:2

我在将文件上传到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。'

谢谢

node.js firebase google-cloud-firestore firebase-storage firebase-security
2个回答
2
投票

[当您使用Firebase时,我建议直接从firebase-admin而不是@google-cloud/storage初始化存储桶。这将对权限进行分类,以便跳过安全规则。

在您的代码中,您还错误地混合了回调API和async /awaitAPI。因为此代码在Cloud Function中运行,所以我建议仅使用Promises和async / await

下面的代码是经过以下更改的重写:

  • 代码已分成逻辑块
  • 不使用回调API(请参阅File#download
  • 每个块将分别记录并抛出错误,以便于调试
  • 单行日志消息(即无堆栈跟踪)
  • 将完整的错误日志记录到云功能(使查找错误的运行变得容易)
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');
  });

0
投票

这似乎是安全规则设置不正确的问题?请尝试使用此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') } document

对于初学者,请尝试以下方法:

video

并且如果证明成功,则可以正确设置存储规则。

© www.soinside.com 2019 - 2024. All rights reserved.