Поскольку вы используете 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') }