从主机

时间:2018-04-09 04:17:41

标签: ajax api express webserver static-html

我有一个静态HTML页面,hello.html。如果我双击hello.html,它会在我的默认浏览器中打开,并正确显示HTML,但是在浏览器的搜索栏中,而不是具有主机名的URL,显示的是我的hello.html的本地文件路径计算机。

我使用express(node.js)在我的计算机上创建了一个简单的快速Web服务器。它设置为侦听端口8080,并具有简单的GET api。 (API现在做的很简单,比如调用'ls')。我希望能够从我的静态hello.html调用那个GET API。在我的静态HTML页面中,我使用jquery对此api进行ajax调用,将其称为http://127.0.0.1:8080/myapi。一旦我启动快速服务器并加载页面,查看控制台日志,当我在浏览器中加载静态HTML页面时,myapi的请求就会通过(ls响应会在控制台上记录),但是,jquery HTML页面中的ajax始终执行错误功能,即使我将响应设置为200。

我正在阅读很多关于为什么会发生这种情况的内容,并且阅读它可能是由于CORS问题。但是,我没有在服务器端指定的主机名,在这种情况下允许,因为实际上没有运行Web服务器,因此没有与我的静态HTML页面关联的实际主机名。

这甚至可以吗? (要在没有运行Web服务器的计算机上安装静态HTML页面,请使用API​​创建自己的快速服务器,并从静态网页调用这些API?)

示例:

hello.html的

<html>
<head>
<title>Hello World</title>
</head>
<body>
<script src"js/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function() {
     $.ajax({
        type: "GET",
        url: "http://127.0.0.1:8080/myapi",
        contentType: 'application/json',
        success: function(response) {
               alert("success!");
        },
        error: function(jqXHR, textStatus, errorThrown) {
                alert("error");
        },
    });
});
</script>


<p>Hello World!</p>
</body>
</html>

myserver.js:

var express = require('express');
var shelljs = require('shelljs');
var app = express();

app.get('/myapi', function (req, res) {

      shellStr = shelljs.exec('ls');
      if ( shellStr ) {
            console.log("successful call on server side");
            res.status(200);
            res.json({ ls: shellStr });
      }
      else {
           console.log("failure status on server side");
           res.status(500).json({ error: "Could not do ls"});
      }
})

var server = app.listen(8080, function() {
     console.log("Listening on 8080");
})

我通过给'node myserver.js'启动服务器,然后在浏览器中打开静态HTML页面。当它加载时,正在进行API调用,因为我看到了服务器端控制台输出,并且它正在成功。但是,回到静态html中,总是执行ajax调用的'error'函数。

1 个答案:

答案 0 :(得分:0)

我得到了它的工作!

如果有其他人想知道,并且是像我这样的表达和网络服务器的新手。

关键是要快递服务hello.html。这样做很简单。

我的快递服务器在这样的目录中:

myserver / myserver.js&lt; - 这是我的快递服务器

我将所有静态html文件移动到同一级别的目录中。

myserver / htmlfiles /&lt; - 这个目录有'hello.html'。

现在,在myserver.js中,我在var app = express()之后的顶部附近添加了以下行:

app.use(express.static('myhtml'))

这样做,是否会告诉express提供目录myhtml中的任何静态文件(将搜索该目录,相对于myserver.js所在的位置。)

如果我重新启动快速服务器(杀死当前的服务器然后再次运行'node myserver.js'),然后转到浏览器,如果我访问http://127.0.0.1:8080/hello.html - 页面会显示出来!

现在域名来源是相同的,当对api进行ajax调用时,它在浏览器中也是成功的!

(注意 - 在这些更改之后我确实遇到了问题,因为我在hello.html中的ajax网址正在调用http://localhost:8080/myapi,但我通过http://127.0.0.1:8080/hello.html在浏览器中显示了hello.html。一旦我将调用的ajax URL更改为http://127.0.0.1:8080/myapi - 一切正常。同样,如果我打开浏览器并转到http://localhost:8080/hello.html并以这种方式显示hello.html,如果调用的ajax URL是{{ 3}} - ajax调用将进入'error'函数。似乎你在HTML页面的ajax URL中使用的主机名必须与主机名相同(127.0.0.01 vs. localhost)用来在调用时访问浏览器中的html页面。)