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

问题描述 投票:0回答:2

我正在尝试部署一个带有静态 html 前端的简单 Node js 应用程序(通过 Google Cloud 应用程序引擎),可以在 here 找到。它在本地运行良好,之前我能够部署后端 api 和前端,而不会出现 appengine 的问题。然而,由于尝试成功部署(以及相关的修补),我现在在前端 (404) 和后端 (500) 上都出现错误。我查看了日志并花了 12 个多小时试图解决这个问题(包括仔细研究日志)。我意识到也有类似的问题,但是在花了几个小时回顾它们之后,我不知所措,夹着尾巴来到小组寻求帮助。 我相信我已将问题范围缩小到 app.yaml 和 package.json 中的某些内容。抱歉,如果 app.yaml 的当前版本(粘贴在下面)一团糟,我已经尝试了此文件的所有内容来尝试解决。似乎是在 URL 处理程序周围,但我真的很茫然。以前我可以成功运行前端或后端,现在我不确定问题是什么。 应用程序.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”字段的工作原理。显然,为“/”路由设置的处理程序已关闭,但我一直在尝试修改。

node.js google-cloud-platform google-app-engine deployment
2个回答
1
投票
    定义 URL 处理程序时,应从限制性最强的模式开始,然后逐渐减少限制性的模式。从您当前的
  1. app.yaml

    开始,

    - url: /(.*)
    将匹配您的所有文件,包括以
    .js
    .css
    结尾的文件,这意味着您创建的其他处理程序,例如
    /(.*\.js)
    /(.*\.css)
    不会被触发。您应该将这两个放在
    - url: /(.*)
    处理程序
     上方
    

  2. 根据您的描述,这是否意味着您正在部署两种不同的服务?如果是这样,则意味着您需要 2 个不同的
  3. app.yaml

    ,在这种情况下,您的问题中使用的是哪一个?您有

    ../public/\1
    public/\1
    。您是否有 2 个公用文件夹,或者您正在从应用程序的不同级别访问公用文件夹?
    
    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.