在 GAE 中发布 nestjs 应用程序

ECC*_*ECC 8 google-app-engine nestjs

我正在学习 nestjs 并且我一步一步地遵循了这个步骤

该应用程序正常工作。但我想将它作为微服务发布到我的 GAE 中。我也能够很好地完成这部分,但是当我在 GPC 中调用地址时,我收到错误 502 - Bad Gateway。

我相信它在我的 package.json 文件中。但我还没有弄清楚。以下是依赖项配置:

   "dependencies": {
   "@ nestjs / common": "^ 5.0.0",
   "@ nestjs / core": "^ 5.0.0",
   "@ nestjs / microservices": "^ 5.0.0",
   "@ nestjs / testing": "^ 5.0.0",
   "@ nestjs / websockets": "^ 5.0.0",
   "reflect-metadata": "^ 0.1.12",
   "rxjs": "^ 6.0.0",
   "typescript": "^ 2.8.0",
   "ts-node": "^ 6.0.0",
   "tsconfig-paths": "^ 3.3.1"
   },
Run Code Online (Sandbox Code Playgroud)

这是我的开始说明:

"start": "ts-node -r tsconfig-paths/register src/main.ts",
Run Code Online (Sandbox Code Playgroud)

最后,我的 app.yaml:

env: flex 
runtime: nodejs 
service: nestapp
Run Code Online (Sandbox Code Playgroud)

Kim*_*m T 20

您可以从 AppEngine Typescript 示例项目开始:

https://github.com/GoogleCloudPlatform/nodejs-docs-samples/tree/master/appengine/typescript

它已经设置了所有的打字稿编译工具。您在 package.json 脚本中需要的关键行是:

"build": "tsc -p tsconfig.build.json",
"gcp-build": "npm run build"
Run Code Online (Sandbox Code Playgroud)

"gcp-build"是在部署 AppEngine NodeJS 项目时始终执行的保留任务名称。这将确保您的 TypeScript 在部署时编译为 JavaScript。你可以在这里读更多关于它的内容:

https://cloud.google.com/appengine/docs/standard/nodejs/running-custom-build-step

一旦你运行了 TypeScript 和 Express,你就可以用 Nest 替换 Express!您还需要更改其他一些内容,即 AppEngine 用于运行应用程序的 package.json 中的入口点:

"main": "dist/main.js",
Run Code Online (Sandbox Code Playgroud)

以及 Nest 应用程序 src/main.ts 中的端口:

const PORT = Number(process.env.PORT) || 8080;
await app.listen(PORT);
Run Code Online (Sandbox Code Playgroud)

在你的 app.yaml 中删除env: flex只使用标准环境,它更便宜!

runtime: nodejs10
Run Code Online (Sandbox Code Playgroud)

将它们放在一起,您的完整 package.json 将如下所示:

{
  "name": "appengine-nest",
  "description": "An example TypeScript app running on Google App Engine.",
  "version": "0.0.1",
  "author": "kmturley",
  "license": "MIT",
  "engines": {
    "node": ">=8.0.0"
  },
  "main": "dist/main.js",
  "scripts": {
    "prepare": "npm run build",
    "pretest": "npm run build",
    "build": "tsc -p tsconfig.build.json",
    "deploy": "gcloud app deploy",
    "lint": "tslint -p tsconfig.json -c tslint.json",
    "start": "node ./dist/main.js",
    "start:dev": "nodemon",
    "start:debug": "nodemon --config nodemon-debug.json",
    "test": "repo-tools test app -- dist/main.js",
    "gcp-build": "npm run build"
  },
  "dependencies": {
    "@nestjs/common": "^5.6.2",
    "@nestjs/core": "^5.6.2",
    "express": "^4.16.3",
    "nodemon": "^1.18.9",
    "reflect-metadata": "^0.1.13",
    "rxjs": "^6.3.3",
    "ts-node": "^8.0.2",
    "tsconfig-paths": "^3.7.0",
    "typescript": "^3.0.1"
  },
  "devDependencies": {
    "@google-cloud/nodejs-repo-tools": "^3.0.0",
    "@types/express": "^4.16.0",
    "tslint": "^5.11.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

我在这里创建了一个示例项目:

https://github.com/kmturley/appengine-nest-angular


zar*_*ior 6

所需的更改

nest new <project>
Run Code Online (Sandbox Code Playgroud)

是:

package.json(主要属性和一些脚本)

{
    ...
+  "main": "dist/main.js",
   "scripts": {
...
-    "build": "nest build",
+    "build": "tsc -p tsconfig.build.json",
+    "gcp-build": "npm run build",
...
-    "start": "nest start",
+    "start": "node ./dist/main.js",    
   }
...
}
Run Code Online (Sandbox Code Playgroud)

src/main.ts(添加要监听的端口环境变量)

async function bootstrap() {
   const app = await NestFactory.create(AppModule);
-  await app.listen(3000);
+  const PORT = Number(process.env.PORT) || 8080;
+  await app.listen(PORT);
 }
 bootstrap();
Run Code Online (Sandbox Code Playgroud)

此外,建议在 package.json 脚本上添加部署脚本

使用 devDependency @google-cloud/nodejs-repo-tools

 +    "deploy": "gcloud app deploy"
Run Code Online (Sandbox Code Playgroud)

注意:解决方案是@Kim T,我只是添加了这种格式的格式,因为我在快速读取和执行它时遇到了麻烦