Google Cloud Storage(Js),asynchronous/等待和云function错误

这是现在解决在GOOGLE侧

Google Cloud NodeJs库现在已经集成了修复程序。 保持这个问题仅供参考。

原文问题

我希望我的代码干净(er),并使用Typescript&async /等待编写访问Google云端存储的Cloud Functions。

我的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 }) 

我已经算出了function的其余部分没有等到这一行完成,整个function执行结束之前,文件从GCS下载到临时path。 所以我把这一节放到try / catch块中:

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

它一直工作到今天。 今天我有这个错误:

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

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

我错过了什么吗?

显然我犯了一些错误,因为还有很多图书馆没有正确的type definitions ,或者根本没有,包括谷歌的和我错误的猜测。

使用没有Type Definitions库时要小心,并打开源代码来查看返回types。

在search解决scheme时,我碰到了这个问题: 与GCS权限相关的错误和修复的bash脚本 。 如果你读了这个答案,也许你的问题与此有关,所以我也在这里分享。

更新:再次,我已经看到一个错误,所以要加倍确保我已经在try/catch包含两个asynchronous调用:

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

更新2:仍然有错误,试图o打字出来,但我打算回到普通的JavaScript。 此外,我已经尝试使用batch file更新ACL,正如我在上面提供的链接中所述,似乎没有帮助。

更新3(有希望成为最后一个):对于与Google云端存储相关的调用,我现在使用普通的javascript承诺,并且与async / await一样,就像Firebase-Functions Samples回购中使用的一样。

更新4:我更改我的代码后,不断上传/读取不一致的错误。 进一步search和…

从另一个描述同样问题的问题阅读这个答案 。 基本上不是我们,这是他们,但他们不承认。 这是因为google-cloud-node包使用套接字的方式。 如果解决这个问题的一些理智的方式出现在这里,将张贴在这里。

更新5:

以下是如何不让套接字永远打开:

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

似乎现在工作。