Google Cloud Function 部署错误:提供的函数不是可加载的模块

Max*_*kov 4 node.js typescript google-cloud-functions

我正在尝试从头开始使用 Typescript 构建我的 GCF 项目。我对这个项目(和这个问题)的目标是了解云功能的工作原理并手动执行所有设置步骤,这就是我不复制任何示例代码或使用自动化工具的原因。

首先,这是我的src/index.ts文件:

export const helloWorld = (req: any, res: any) => {
    res.send('Hello, world 4');
}
Run Code Online (Sandbox Code Playgroud)

运行打字稿编译器后,我得到了这个dist/index.js文件,这似乎完全合理:

"use strict";
exports.__esModule = true;
exports.helloWorld = function (req, res) {
    res.send('Hello, world 4');
};
Run Code Online (Sandbox Code Playgroud)

package.json的设置指向这个文件:

{
  "main": "dist/index.js",
  "scripts": {
    "start": "npx tsc-watch --onSuccess 'npx @google-cloud/functions-framework --target=helloWorld'",
    "deploy": "gcloud functions deploy helloWorld --runtime nodejs10 --trigger-http"
  },
  "dependencies": {
    "@google-cloud/functions-framework": "^1.1.2",
    "tsc-watch": "^2.2.1",
    "typescript": "^3.5.3"
  }
}
Run Code Online (Sandbox Code Playgroud)

我想先设置本地测试环境,所以我使用了函数框架。当我运行它时,一切正常:

$ npx @google-cloud/functions-framework --target=helloWorld
Serving function...
Function: helloWorld
URL: http://localhost:8080/
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试部署时,出现此错误:

$ gcloud functions deploy helloWorld --runtime nodejs10 --trigger-http
Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
Deploying function (may take a while - up to 2 minutes)...failed.
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code. Error message: Provided code is not a loadable module.
Could not load the function, shutting down.
Run Code Online (Sandbox Code Playgroud)

为什么它说我index.js的不是一个可加载的模块,我该如何解决这个错误?


更新

结果gcloud是不尊重package.jsonmain领域。当我指定它应该dist使用--source标志显式获取文件夹时,它部署了文件:

gcloud functions deploy helloWorld --source=dist/ --runtime nodejs10 --trigger-http
Run Code Online (Sandbox Code Playgroud)

但是,它仍然不起作用,因为它似乎假设所有内容,包括 package.json,都包含在此目录中 - 因此它不链接任何库依赖项。

Max*_*kov 7

事实证明,.gitignore默认情况下是在 GCF 的.gcloudignore文件中导入的,并且由于我忽略了 .js 文件中的 js 文件.gitignore,因此它们永远不会进入 GCF。

要修复它,只需删除此行:

#!include:.gitignore
Run Code Online (Sandbox Code Playgroud)

我还创建了一个小型模板项目,用于在 GCF 中使用 Typescript。


Vin*_*rga 5

在您的文件中添加!/dist后。#!include:.gitignore.gcloudignore

在我看来,最好将该#!include:.gitnore行保留在.gcloudignore文件中,这样当人们向 中添加内容时.gitignore,它也会自动包含在 中.gcloudignore

对于您希望被忽略git但不被忽略的文件和目录gcloud,我会在文件中显式添加它们.gcloudignore

让我们以我的例子为例,我有一个 TypeScript 项目。我不希望 的输出tsc受到版本控制,但我确实希望包含这些文件,原因很明显: ( 或) 文件夹gcloud中的文件实际上是我的函数(应用程序)。builtdist

### .gitignore
node_modules
built

### .gcloudignore file's content
#!include:.gitignore
# Do not ignore built (or dist) folder for gcloud:
!/built
!/dist
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个解决方案,因为默认情况下,来自 git 的忽略文件也会被 gcloud 忽略,所以我不需要担心人们忘记我们有多个忽略文件。