Firebase Admin SDK无法通过以下顺序从一组连续上传中进行任意上传:“无法解析JSON响应”

时间:2019-04-06 20:40:45

标签: node.js firebase google-cloud-storage firebase-storage firebase-admin

使用Firebase Storage Admin SDK并顺序上传文件(然后在每次成功上传后生成签名的URL)时,某些上传会失败(失败率是任意的,例如5k个文件中有5-10个失败):

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帐户并在本地服务帐户初始化的Node.js实例上运行Admin SDK时,会发生这种情况。

我做了什么

  1. 使用5k个对象创建一个JSON数组,指向3个不同的图像,并保存在本地。
  [{
    "imgUri": "img/1.png"
  },
  {
    "imgUri": "img/2.jpg"
  },
  {
    "imgUri": "img/3.jpg"
  },
  {
    "imgUri": "img/1.png"
  }...]
  1. 遍历数组,依次上传每个文件。成功上传文件后,并为每个成功文件生成一个签名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-80kb => 2kb
    • 2.jpg-160kb => 3kb
    • 3.jpg-73kb => 2kb
  2. 记录已使用的内存以排除任何内存泄漏,但是在rss,heapTotal,heapUsed或外部内存上从未超过100 MB

  const used = process.memoryUsage();
    for (let key in used) {
        console.log(`${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
    }
  1. 使用run参数为Node.js分配更多内存以供使用:
 --max-old-space-size=8192
  1. 我还尝试在Google Cloud Storage文档中找到批量上传选项(例如在Firestore中),但无济于事。

我想知道是否有一种方法可以将大量图像一致地上传到Firebase Storage。

0 个答案:

没有答案