提问人:Evan R 提问时间:11/14/2023 最后编辑:Evan R 更新时间:11/15/2023 访问量:84
在 GC appengine 上部署节点 js 时出现 404 和 500 错误
404 and 500 errors deploying node js on GC appengine
问:
我正在尝试部署一个简单的节点 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字段的确切工作方式。显然,为“/”路由设置的处理程序已关闭,但我一直在兜圈子试图修改。
答:
定义 URL 处理程序时,应从限制性最强的模式开始,然后再使用限制性较低的模式。从您当前的 ,将匹配您的所有文件,包括以 或 表示您创建的其他处理程序结尾的文件,例如 并且不会被触发。您应该将这两个放在处理程序上方
app.yaml
- url: /(.*)
.js
.css
/(.*\.js)
/(.*\.css)
- url: /(.*)
从您的描述来看,这是否意味着您正在部署 2 个不同的服务?如果是这样,这意味着您需要 2 个不同的问题,在这种情况下,您的问题中有哪一个?你有 和 .您有 2 个公用文件夹,还是从应用程序的不同级别访问公用文件夹?
app.yaml
../public/\1
public/\1
评论