【问题标题】:Node.js + static content served by Google App EngineNode.js + Google App Engine 提供的静态内容
【发布时间】:2016-01-22 20:54:00
【问题描述】:

Google Cloud 文档对用于我的 Node.js 应用程序的 app.yaml 文件的可用语法不是很精确。

我使用了Python documentation for GAE 中描述的语法,从中我找到了 handlers 机制:

    handlers:
    - url: /index.html
      static_files: /public/index.html
      upload: /public/index.html

我已经避免了我的 expressjs 规则来提供 /public/index.html 内容,最后我得到了 404 错误,这意味着 GAE 没有将我的页面作为静态内容提供:

    $ curl -i "http://my-project/index.html"
    HTTP/1.1 404 Not Found
    ...

您对此有任何线索吗? Node.js 与制作 API、生成动态内容有关……但我更喜欢使用 Google 后端甚至 Nginx 服务器来处理静态内容。

更新

删除前导斜杠并不能解决问题。我稍微改变了我的 app.yaml 配置:

    handlers:
    - url: /api/.*
      secure: always
      script: app.js
    - url: /.*
      secure: always
      static_dir: public

我仍然在/index.html 上得到 404 Not found,并且得到 调用 /api/stuff 时的正确 200 OK 答案。

这是我的项目树结构:

    Project root
    |- app.js
    |- app.yaml
    |- package.json
    |- public/
    |  `-- css/
    |     `-- style.css
    |  `-- js/
    |     `-- main.js
    |  `-- index.html

【问题讨论】:

  • 您是否仍然对 Nodejs 运行时 app.yaml 中的 static_dir 静态文件处理程序有问题? Dan 提供的答案是否有效(从 cmets 中似乎不清楚)?

标签: node.js google-app-engine google-cloud-platform httpserver app.yaml


【解决方案1】:

文档页面上的示例通常就足够了。

static_filesupload 值中有一个前导 /,这应该只是到应用目录顶部的相对路径。

也可能有其他原因,起点是您的应用程序的日志,无论是在您的开发服务器上还是在 GAE 上(如果已部署)。

更新:

根据Static directory handlers doc

静态目录示例:

handlers:
# All URLs beginning with /stylesheets are treated as paths to static files in
# the stylesheets/ directory.
- url: /stylesheets
  static_dir: stylesheets

网址

网址前缀。该值使用正则表达式语法(因此正则表达式 特殊字符必须转义),但不应包含 分组。所有以这个前缀开头的 URL 都由这个处理 处理程序,使用前缀后的 URL 部分作为 文件路径。

根据这句话,我怀疑app.yaml 的处理程序规范的url 中的通配符可能会导致问题(例如,/index.html 可能实际上会扩展为/index.html/ 通过 static_dir 解析逻辑),我会替换 url 以清楚地指示目录,如下所示:

- url: /
  secure: always
  static_dir: public

我不喜欢将应用程序命名空间的顶级 / 绑定到静态目录,但对于一般静态的应用程序来说可能没问题。确保您始终将此处理程序规范保留在您的 app.yaml 文件中,以避免出现问题。

【讨论】:

  • 感谢您的回答,我放弃了领先的/,但没有任何改变。我收到此错误,这意味着处理程序已被解析但仍然找不到文件:Static file referenced by handler not found: public/index.html
  • 请编辑问题,添加项目的目录结构以显示index.html 文件所在的位置。
  • 我只用一个“/”设置了您的处理程序,但它仍然无法正常工作。我仍然收到错误:“找不到处理程序引用的静态文件:public/”、“找不到处理程序引用的静态文件:public/index.html”和“找不到处理程序引用的静态文件:public/index.html/ ” 当我分别请求“/”、“/index.html”、“/index.html/”时。你有什么线索吗?您知道如何向 Google 开发人员报告错误吗?谢谢!
  • 你的网址仍然是/.*,而不是/
  • 不,不是。我在我的处理程序中使用 /: - url: / secure: always static_dir: public
猜你喜欢
  • 1970-01-01
  • 2017-10-06
  • 2017-08-15
  • 2012-04-26
  • 1970-01-01
  • 2015-05-28
  • 2019-05-19
  • 2016-09-02
  • 1970-01-01
相关资源
最近更新 更多