我在将文件上传到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。'
谢谢
[当您使用Firebase时,我建议直接从firebase-admin
而不是@google-cloud/storage
初始化存储桶。这将对权限进行分类,以便跳过安全规则。
在您的代码中,您还错误地混合了回调API和async
/await
API。因为此代码在Cloud Function中运行,所以我建议仅使用Promises和async
/ await
。
下面的代码是经过以下更改的重写:
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');
});
这似乎是安全规则设置不正确的问题?请尝试使用此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
并且如果证明成功,则可以正确设置存储规则。