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

我正在 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: nodejs10


handlers:


- 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 问题还是其他问题?


慕斯709654
浏览 172回答 1
1回答

慕无忌1623718

仔细检查 GAE 日志条目以获取所请求的确切 URL(并被 404 拒绝)。这通常需要与您的静态处理程序的url模式之一匹配。如果发生匹配,则由相应处理程序的static_file/static_dir和upload规范(相对于您的应用程序的顶级目录 - app.yaml 文件所在的位置)指定的文件应该发生。让我们假设初始请求是针对/.&nbsp;这与您的第一个静态处理程序匹配,因此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目录的文件):-&nbsp;url:&nbsp;/(.*\.js)$ &nbsp;&nbsp;static_files:&nbsp;www/js/\1 &nbsp;&nbsp;upload:&nbsp;www/js/.*\.js$或者,您可以使用可应用于多种类型文件的方案,而不是那些以 结尾的方案.js:使用文件中的www前缀引用index.html文件:`<script&nbsp;src="www/js/index.js"></script>`重新使用您的最后一个处理程序,但向其添加通配符以url确保匹配下的所有内容www(因为www/blah与 justwww模式不匹配):`-&nbsp;url:&nbsp;/www/*`也可以在没有.js后缀的情况下引用脚本,但是您需要一个专门用于该文件的处理程序 - 要将其映射到实际文件名,您不能使用通配符。所以我不推荐这样做,因为它很快就会变得非常复杂。您必须类似地考虑您需要提供的所有其他静态元素。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript