为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 JS 和 NodeJS 服务器为标准 html 页面正确配置 app.yaml?

如何使用 JS 和 NodeJS 服务器为标准 html 页面正确配置 app.yaml?

慕斯709654 2021-09-30 10:23:50
我正在 AppEngine 上设置一个简单的网络应用程序,但在配置 app.yaml 时遇到了一些问题。它包括一个 HTML 页面、一个 JS 脚本和一个 NodeJS 服务器。我的项目结构:\app.yaml\package.json\www    \index.html    \js        \server.js        \index.js索引.html:<!DOCTYPE html><html><body>    <div id="JShere" >Hello World !</div>    <div id="ReqAnswer"></div></body><script src="js/index"></script></html>索引.js:  document.getElementById('JShere').innerHTML = "JS is running";  var xhr = new XMLHttpRequest();  xhr.open('GET', "/srv", true);  xhr.send();  xhr.addEventListener("readystatechange", processRequest, false);  function processRequest(e) {    if (xhr.readyState == 4 && xhr.status == 200) {        document.getElementById('ReqAnswer').innerHTML = xhr.responseText;    }}node.js 服务器:const express = require('express');const app = express();app.get('/srv', function (req, res) {  res.send('Request anwser')})const PORT = process.env.PORT || 8080;app.listen(PORT, () => {  console.log(`Server listening on port ${PORT}...`);});包.json:...  "scripts": {    "start": "node www/js/server.js",    "test": "mocha --exit test/*.test.js"  },...应用程序.yaml:runtime: nodejs10handlers:- url: /  static_files: www/index.html  upload: www/index.html- url: /index  static_files: www/index.html  upload: www/index.html- url: /page2  static_files: www/page2.html  upload: www/page2.html- url: /www  static_dir: www当我在本地检查时,index.js 会正确修改index.html,但是当我将其部署到 App Engine 时,index.js被阻止(MIME 类型(« text/html »))。然后它“无法加载” index.html。尽管如此,脚本仍然向服务器发起 GET 请求并得到 404 错误。是 App.yaml 问题还是其他问题?
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

仔细检查 GAE 日志条目以获取所请求的确切 URL(并被 404 拒绝)。这通常需要与您的静态处理程序的url模式之一匹配。如果发生匹配,则由相应处理程序的static_file/static_dirupload规范(相对于您的应用程序的顶级目录 - app.yaml 文件所在的位置)指定的文件应该发生。

让我们假设初始请求是针对/. 这与您的第一个静态处理程序匹配,因此www/index.html将为您提供服务。

但是该index.html文件引用了js/index里面的脚本,因此另一个请求将跟随该 URL。但是该 URL 与您的任何处理程序的模式都不匹配,因此它会得到 404。您也没有任何名为index.

假设在这种情况下www/js/index.js您想要提供的实际上是您必须提供的文件:

  • 更正文件中的index.html文件名引用:

    <script src="js/index.js"></script>

  • 确保此引用与静态处理程序url模式匹配。可能是这样的(对于每个以 结尾的请求路径.js将尝试提供与该路径匹配但相对于www/js目录的文件):

    - url: /(.*\.js)$
      static_files: www/js/\1
      upload: www/js/.*\.js$

或者,您可以使用可应用于多种类型文件的方案,而不是那些以 结尾的方案.js

  • 使用文件中的www前缀引用index.html文件:

    `<script src="www/js/index.js"></script>`
  • 重新使用您的最后一个处理程序,但向其添加通配符以url确保匹配下的所有内容www(因为www/blah与 justwww模式不匹配):

    `- url: /www/*`

也可以在没有.js后缀的情况下引用脚本,但是您需要一个专门用于该文件的处理程序 - 要将其映射到实际文件名,您不能使用通配符。所以我不推荐这样做,因为它很快就会变得非常复杂。

您必须类似地考虑您需要提供的所有其他静态元素。


查看完整回答
反对 回复 2021-09-30
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信