Google云端存储(Js),Async / Await&云功能错误

时间:2017-05-02 14:38:29

标签: javascript node.js asynchronous google-cloud-storage google-cloud-functions

现已在Google GOOGLE上解决

Google Cloud NodeJs库现已修复集成。保留这个问题仅供参考。

原始问题

我希望我的代码干净(呃)并使用Typescript& async / await写云功能访问谷歌云存储。

tsconfig.json的一些重要部分:

{
  "compilerOptions": {
    "declaration": false,
    "target": "es6",
    "module": "commonjs",
    "noImplicitAny": true,
    "removeComments": true,
    "noUnusedLocals": true,
    "moduleResolution": "node",
    "sourceMap": false,
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2016"
    ],
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "outDir": "./"
  }
}

我遇到的第一个错误是ECONNRESET而我正在拨打这样的电话,这可能会导致它:

await bucket.file(path).download({
  destination: tempFilePath
})

我认为该函数的其余部分没有等到该行完成并且整个函数执行在文件从GCS下载到临时路径之前结束。 所以我把那个部分放到了try / catch块中:

  try { 
    await bucket.file(path).download({
      destination: tempFilePath
    })
  } catch (error) {
    console.log(error);
  }

直到今天一直很好。今天我遇到了这个错误:

convert: Empty input file '/temp/img-file.jpg'

这让我觉得在将文件从存储桶下载到临时文件夹之前执行下一行(转换图像大小)。

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

显然我犯了一些错误,因为还有很多图书馆没有合适的type definitions,或根本没有,包括谷歌的图书馆,而且我做错了猜测。

小心使用没有Type Definitions的库并打开它们的源以查看返回类型。

在搜索解决方案时,我也遇到了这个问题:GCS permissions related error and a bash script to fix。如果你读到这个答案,也许你的问题与此有关,所以我也在这里分享。

更新: 我再次发现错误,所以要加倍确保我在try/catch中同时包含了异步调用:

  let myBucket : any = {};

  try {
    myBucket = await googlecloudstorage.bucket('<bucket-id>');
    await myBucket.file(path).download({
      destination: tempFilePath
    })
  } catch (error) {
    console.log(error);
  }

更新2: 仍然有错误,尝试在Typescript中找出它但我打算回到普通的javascript。此外,我已尝试使用批处理文件更新ACL,如上面提到的链接问题所示,上面没有提供任何帮助。

更新3(希望成为最后一次): 好吧,对于与Google云端存储相关的电话,我现在使用普通的javascript promises并抛弃async / await,就像Firebase-Functions Samples repo中使用的那样,到目前为止一直很好。

更新4: 在更改我的代码后,上传/读取不一致时,我不断收到错误。进一步搜索和...

从另一个描述相同问题的问题中阅读this answer。基本上它不是我们,而是它们,但它们并不承认。这是因为google-cloud-node包使用套接字的方式。 如果有一些明智的解决办法,就会在这里发布。

更新5:

以下是不要永久保持套接字打开的方法:

var gcs = require('@google-cloud/storage')(...)
gcs.interceptors.push({
  request: function(reqOpts) {
    reqOpts.forever = false
    return reqOpts
  }
})

......现在似乎有效。