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

时间:2019-07-17 13:21:22

标签: node.js typescript google-cloud-functions

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

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

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

运行Typescript编译器后,我得到了这个dist/index.js文件,这似乎很合理:

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

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

我想先设置本地测试环境,所以我使用了functions framework。当我运行它时,一切都完美运行:

$ npx @google-cloud/functions-framework --target=helloWorld
Serving function...
Function: helloWorld
URL: http://localhost:8080/

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

$ 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.

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


更新

结果是gcloud不遵守package.json的{​​{1}}字段。当我指定应该使用main标志将dist文件夹显式地放置时,它部署了文件:

--source

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

2 个答案:

答案 0 :(得分:1)

!/dist文件的#!include:.gitignore之后添加.gcloudignore

我认为最好将#!include:.gitnore行保留在.gcloudignore文件中,以便当人们向.gitignore添加内容时,它会自动包含在{{1 }}。

对于希望由.gcloudignore而不是git忽略的文件和目录,我将在gcloud文件中明确地添加它们。

让我们以我的示例为例,其中有一个TypeScript项目。我不希望.gcloudignore的输出受版本控制,但是出于明显的原因,我确实希望这些文件包含在tsc中:gcloud(或{{ 1}})文件夹实际上是我的功能(应用程序)。

built

我更喜欢这种解决方案,因为默认情况下,gcloud也会忽略git中忽略的文件,因此我不必担心人们会忘记我们有多个忽略文件。

答案 1 :(得分:0)

结果是,.gitnore默认情况下被导入到GCF的.gcloudignore文件中,并且由于我忽略了.gitignore中的js文件,因此它们从不进入GCF。

要修复此问题,只需删除以下行:

#!include:.gitnore

我还创建了small template project以便将Typescript与GCF结合使用。