将Google App Engine应用程序部署到GCP时出现问题

时间:2019-09-12 00:57:08

标签: node.js express google-app-engine node-modules package.json

摘要

使用网络预览时,我的node.js express服务器应用程序在Google App Engine上的工作原理像冠军。但是,当我尝试进行部署时(通常是通过Google Cloud Console进行部署),该应用程序将无法再使用。当我点击URL时,出现“ 500错误:服务器错误服务器遇到错误,无法完成您的请求。请在30秒内重试。” 30秒,30分钟,30小时以后-仍然是同样的错误。非常令人困惑,因为该Web应用程序在我的本地计算机上以及在GCP上使用Web预览时都可以正常工作-只是在尝试进行最终部署时。

背景

在本地计算机上完美运行。将代码上传到我在git上的存储库中,然后克隆到我的App Engine项目中,然后安装npm,然后在Google App Engine(GAE)上启动npm。 Web预览签出就可以了。 Gcloud应用部署将文件正确上传到区域中并提供URL。那时候它不起作用-我收到500错误。使用“ gcloud应用程序日志尾号-s默认值”查看了错误消息。

我尝试过的事情:

  • 将package.json中的快速版本号从4.17更改为4.16-无法解决错误
  • 确保我在本地计算机上使用的节点版本是节点10,因为那是GAE上的版本(我在本地计算机上是12)–应用程序在本地计算机上仍可正常运行
  • 删除了原始项目,并从头开始创建了另一个项目并创建了应用程序-部署时仍然有问题(我想我可能已经切换了区域/区域,但我不确定。)-这无法解决错误。

代码部分

1. app.js
const express = require('express');
const path = require('path');
/* Tutorial: https://www.youtube.com/watch?v=L72fhGm1tfE */

const server2 = express();

oneHundredTenDays = 60*1000*60*24*110; // cache (110 days)

// Set a static folder
server2.use(express.static(path.join(__dirname, 'public'), {maxAge: oneHundredTenDays}));

const PORT = process.env.PORT || 5006;

server2.listen(PORT, () => console.log(`Express server2 started on port ${PORT}`));

2. app.yaml-将所有http请求重定向到https请求
handlers:
- url: /.*
script: auto
secure: always
redirect_http_response_code: 301

runtime: nodejs10

3. package.json
{
"name": "expressserver2",
"version": "1.0.0",
"description": "https://www.youtube.com/watch?v=L72fhGm1tfE",
"main": "app.js",
"scripts": {
   "startSecure": "node appHttps",
   "devSecure": "nodemon appHttps",
   "startUnsecure": "node app",
   "devUnsecure": "nodemon app"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
  "express": "^4.16.1"
},
"devDependencies": {
   "nodemon": "^1.19.1"
}
}

4.我在Google Cloud Shell上使用的命令的历史记录:
409  rm -rf expressServer2
410  git clone https://github.com/xxxxxxxxxx/expressServer2
411  cd expressServer2/
412  cp ../expressServer1/app.yaml .
413  export PORT=9088 && npm install
414  npm run startd
415  more package.json
416  npm run startUnsecure
417  gcloud app create
418  gcloud app deploy
419  gcloud app logs tail -s default

错误日志:

我希望看到一个正在运行的Web应用程序(正如我在上面的命令416之后执行Web预览时所看到的那样)。现在,对于发出命令419后出现的错误:

2019-09-11 21:04:50 default[20190911t170310]  Error: Cannot find module '/srv/server.js'      at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)      at Function.Module._load (internal/modules/cjs/loader.js:562:25)      at Function.Module.runMain (internal/modules/cjs/loader.js:829:12)      at startup (internal/bootstrap/node.js:283:19)      at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
2019-09-11 21:04:50 default[20190911t170310]  "GET /favicon.ico HTTP/1.1" 500
2019-09-11 21:04:51 default[20190911t170310]  internal/modules/cjs/loader.js:638
2019-09-11 21:04:51 default[20190911t170310]      throw err;
2019-09-11 21:04:51 default[20190911t170310]      ^
2019-09-11 21:04:51 default[20190911t170310]
2019-09-11 21:04:51 default[20190911t170310]  Error: Cannot find module '/srv/server.js'      at Function.Module._resolveF

我认为这个网站图标是鲱鱼。问题在于应用程序找不到'/ srv / server.js'。我现在不知所措。 Google部署服务器环境确实与Web预览版本有什么不同吗?

顺便说一句:如果您认为其中的任何一个重要问题,它所提供的页面都不是完全静态的-一些简单的javascript-一个文本框输入和一些图像。

我会推荐任何潜在顾客。

1 个答案:

答案 0 :(得分:1)

因为您遇到了

  

错误:找不到模块'/srv/server.js'

尝试将以下行添加到 package.json 文件中的“scripts”

"start": "node app.js",

请记住,当 Google App Engine 为您的应用程序创建新实例时,该实例必须首先加载处理请求所需的库和资源。 / p>

如果仅修改您的 package.json 文件不能解决问题,则原因可能是您没有任何准备好处理的活动实例请求,这会导致它们在 App Engine 将代码加载到新实例中时超时(请参阅此post中描述的问题)

在这种情况下,您可能要reduce the duration个加载请求。另外,即使没有流量,您也可以使用warmup requests使实例保持活动状态。

让我知道是否有帮助。