gpt4 book ai didi

node.js - Firebase 存储文件下载在一段时间后停止工作

转载 作者:太空宇宙 更新时间:2023-11-03 23:12:20 25 4
gpt4 key购买 nike

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

});

我收到的错误是:

Anonymous caller does not have storage.objects.get access to project-name.appspot.com/CrTwBuyNR2-log-2020-1-16-12-18.csv.'

谢谢

最佳答案

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

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

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

  • 代码已被分割成逻辑 block
  • 不使用回调 API(请参阅 File#download)
  • 每个 block 都会单独记录和抛出错误,以便于调试
  • 单行日志消息(即无堆栈跟踪)
  • 将完整的错误日志记录保留到 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') }

关于node.js - Firebase 存储文件下载在一段时间后停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59768613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com