【问题标题】:Firebase Storage file download stops working after a whileFirebase 存储文件下载在一段时间后停止工作
【发布时间】:2020-05-03 05:38:54
【问题描述】:

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


    【解决方案1】:

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

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

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

    • 代码已被拆分为逻辑块
    • 不使用回调 API(请参阅 File#download
    • 每个块都会分别记录和抛出错误,以便于调试
    • 单行日志消息(即无堆栈跟踪)
    • 将完整的错误日志记录留给 Cloud Functions(使查找错误运行更容易)
    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') }
    

    【讨论】:

    • 我认为混合回调和异步/等待是问题所在。我最初尝试使用 firebase-admin,所以情况并非如此。谢谢
    【解决方案2】:

    这似乎是安全规则设置不正确的问题?请试试这个documentvideo

    对于初学者来说,试试这个:

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

    如果证明成功,请正确设置存储规则。

    【讨论】:

    • 是的。此外,如果没有设置规则,它总是会失败。但它会定期工作。
    • 同一用户在不同场合会发生这种情况?
    • 是的。每分钟都在上传文件。一段时间后处理失败。然后又重新开始。
    • 每个人都会遇到这种情况吗?可能是网络问题?
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多