Firebase Admin SDK не может выполнить произвольную загрузку из набора последовательных загрузок: «Не удается проанализировать ответ JSON» - PullRequest
0 голосов
/ 06 апреля 2019

При использовании 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, инициализированном учетной записью службы.

Что я сделал

  1. Создан массив 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. Уменьшение размера файла:

    • 1.png - 80 КБ => 2 КБ
    • 2.jpg - 160 КБ => 3 КБ
    • 3.jpg - 73 КБ => 2 КБ
  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.

...