繁体   English   中英

Google云端存储(Js),异步/等待和云功能错误

[英]Google Cloud Storage (Js), Async/Await & Cloud Functions Errors

这已经在Google SIDE上解决了

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

原始问题

我希望我的代码干净(呃)并使用Typescript和async / await编写访问Google云端存储的云功能。

我的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'

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

我错过了什么吗?

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

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

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

更新:我再次看到一个错误,所以要加倍确保我在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:在更改我的代码后,上传/读取不一致时,我一直收到错误。 进一步搜索和......

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

更新5:

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

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

...现在似乎有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM