在 GC appengine 上部署节点 js 时出现 404 和 500 错误

404 and 500 errors deploying node js on GC appengine

提问人:Evan R 提问时间:11/14/2023 最后编辑:Evan R 更新时间:11/15/2023 访问量:84

问:

我正在尝试部署一个简单的节点 js 应用程序(通过 Google Cloud 应用程序引擎)和一个静态 html 前端,可在此处找到。它在本地运行良好,以前我能够毫无问题地将后端 api 和前端部署到 appengine。但是,由于尝试成功部署(以及相关的修补),我现在在前端 (404) 和后端 (500) 上都出现了错误。我已经查看了日志,并花了 12+ 小时试图弄清楚这一点(包括仔细研究日志)。我意识到也有类似的问题,但是在花了几个小时查看它们之后,我不知所措,夹着尾巴来到小组寻求帮助。 我相信我已经将问题缩小到 app.yaml 和 package.json 中的内容。对不起,如果当前版本的app.yaml(粘贴在下面)一团糟,我已经尝试了这个文件的所有方法来尝试解决。似乎在 URL 处理程序周围,但我真的不知所措。以前我可以成功地运行前端或后端,现在我不确定问题是什么。 app.yaml:

runtime: nodejs20
env: standard
instance_class: F1
handlers:
  - url: /api/quotes
    script: auto
  - url: /(.*)
    static_files: public/\1
    upload: public/.*
  - url: /(.*\.js)
    static_files: ../public/\1
    upload: /public/(.*\.js)
  - url: /(.*\.css)
    static_files: /public/\1
    upload: /public/(.*\.css)
  - url: /.*
    script: auto
  - url: .*
    script: auto
env_variables:
  MONGODB_URI: >-
    mongodb+srv://user:[email protected]/?retryWrites=true&w=majority
automatic_scaling:
  min_idle_instances: automatic
  max_idle_instances: automatic
  min_pending_latency: automatic
  max_pending_latency: automatic
service_account: [email protected]

请注意,在上面,出于安全原因,我替换了mongodb密码,但实际文件具有它并且工作正常。

下面是日志中错误的 textPayload 字段

from Error: Cannot find module '/workspace/server.js'
    at Module._resolveFilename (node:internal/modules/cjs/loader:1048:15)
    at Module._load (node:internal/modules/cjs/loader:901:27)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
    at node:internal/main/run_main_module:23:47 {

我知道这是一个简单的新手错误,但任何帮助将不胜感激,因为我已经用尽了我能想到的所有选项。谢谢!

编辑:我能够修复后端,api/quotes 路由现在按预期返回数据!但是,我仍然得到前端 (/) 的 404,但我仍然对如何修改 app.yaml 文件进行修复感到困惑(假设问题出在这里)。

前端 404 的最新日志:

logMessage:“未找到处理程序引用的静态文件:public/”

浏览器中的前端错误(控制台也返回 404):

错误:未找到 在此服务器上找不到请求的 URL/。 根据日志和我在浏览器中看到的内容,我需要更改主页的 app.yaml 中的 URL 处理程序,但仍然有点不确定上传和static_files字段的确切工作方式。显然,为“/”路由设置的处理程序已关闭,但我一直在兜圈子试图修改。

节点 .js 谷歌云平台 谷歌应用引擎 部署

评论


答:

2赞 NoCommandLine 11/15/2023 #1
  1. 定义 URL 处理程序时,应从限制性最强的模式开始,然后再使用限制性较低的模式。从您当前的 ,将匹配您的所有文件,包括以 或 表示您创建的其他处理程序结尾的文件,例如 并且不会被触发。您应该将这两个放在处理程序上方app.yaml- url: /(.*).js.css/(.*\.js)/(.*\.css)- url: /(.*)

  2. 从您的描述来看,这是否意味着您正在部署 2 个不同的服务?如果是这样,这意味着您需要 2 个不同的问题,在这种情况下,您的问题中有哪一个?你有 和 .您有 2 个公用文件夹,还是从应用程序的不同级别访问公用文件夹?app.yaml../public/\1public/\1

评论

0赞 Evan R 11/15/2023
谢谢你的提示!上面的 app.yaml 文件是无休止地搞砸它的结果,我有点粗心大意(没有恢复中断性更改/那些不起作用的更改),这就是我们看到 2 个不同的公共文件夹的原因。