При использовании Firebase Storage Admin SDK и последовательной загрузке файлов (затем создание подписанных URL-адресов после каждой успешной загрузки) некоторые загрузки завершаются неудачно (частота ошибок произвольна, например 5-10 ошибок из файлов 5k):
Error: Cannot parse JSON response
at Util.parseHttpRespBody (C:\Git\MyStore\my-store-firebase\node_modules\@google-cloud\common\build\src\util.js:185:42)
at Util.handleResp (C:\Git\MyStore\my-store-firebase\node_modules\@google-cloud\common\build\src\util.js:134:117)
at retryRequest (C:\Git\MyStore\my-store-firebase\node_modules\@google-cloud\common\build\src\util.js:422:22)
at onResponse (C:\Git\MyStore\my-store-firebase\node_modules\retry-request\index.js:200:7)
at C:\Git\MyStore\my-store-firebase\node_modules\teeny-request\build\src\index.js:158:17
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:189:7)
Это происходит при использовании учетной записи Firebase Blaze и запуске Admin SDK на локальном экземпляре Node.js, инициализированном учетной записью службы.
Что я сделал
- Создан массив JSON с 5k объектами, указывающими на 3 разных изображения, сохраненных локально.
[{
"imgUri": "img/1.png"
},
{
"imgUri": "img/2.jpg"
},
{
"imgUri": "img/3.jpg"
},
{
"imgUri": "img/1.png"
}...]
Проход по массиву, загрузка каждого файла последовательно.И создание подписанного URL для каждого успешно загруженного файла после его успешной загрузки
const bucket = admin.storage().bucket('*bucket_name*');
async function uploadProductImages(productData) {
var results = [];
for (var product of productData) {
results.push(await uploadProductImage(vendorId, product.imgUri));
}
return results;
}
async function uploadProductImage(filePath) {
try {
let fileRelativePath = filePath;
let uploadOptions = {
predefinedAcl: 'publicRead',
destination: Date.now()+'_'+'*image-destination*'+'*file_name(DOT)file_extension*'
};
var fileData = await bucket.upload(fileRelativePath, uploadOptions);
return await getFileUrl(file);
} catch (err) {
//This is where the error that I pasted, gets thrown
console.error('uploadProductImage | ' + err.stack);
}
}
async function getFileUrl(file){
var url = (await file.getSignedUrl({
action: 'read',
expires: '01-01-2020'
}))[0];
return url;
}
Я попытался
Уменьшение размера файла:
- 1.png - 80 КБ => 2 КБ
- 2.jpg - 160 КБ => 3 КБ
- 3.jpg - 73 КБ => 2 КБ
Регистрация использованной памяти для исключения любых утечек памяти, но она никогда не превышала 100 мегабайт ни по rss, heapTotal, ни по heapUsed, ни по внешнему
const used = process.memoryUsage();
for (let key in used) {
console.log(`${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}
Предоставил Node.js больше памяти для использования с параметром run:
--max-old-space-size=8192
Я также пытался найти параметры пакетной загрузки (как в Firestore) в документации Google Cloud Storage, но безрезультатно.
Я хотел бы знать, если есть способ последовательно загружать многочисленныеизображений в Firebase Storage.