2

由于我不知道我不能在节点 js 和 express 中创建的本地服务器中使用 xmlhttprequest 的原因。让我告诉你......这是节点JS中的服务器:

var 
express = require('express'),
app = express.createServer();

app.get('/count', function(req, res) {
    res.type('text/plain');
    res.write('Hello!')
     res.end();
});

app.listen(4003);

它运行得很好!当我访问 localhost:4003/count 我看到“你好!”。

现在服务器已经OK了,我们来看看html页面:

<script>

var xmlhttp = new XMLHttpRequest();
var resp = ""
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
        resp = xmlhttp.responseText;
        }
}

var cam = "localhost:4003/count"


function show(){
    xmlhttp.open("GET",cam,  true);
    xmlhttp.send();
    alert(resp);
}

</script>

<center><h1><div style="color:#339966"> <input type="button" value="Return of /count" onclick="javascript:show()"> </div> </h1>

所以,它只是不起作用= [,我已经尝试过:

  • 改变localhost:4003/count为变量的值cam,对于http://localhost:4003/count127.0.0.1:4003/count
  • 在 Firefox、Safari 和 Chrome 中打开。
  • 当我尝试查看它xmlhttp.status时,alert()它显示' 0'。(但页面在任何浏览器中都能正常打开)
4

2 回答 2

5

除了摩根已经涵盖的时间问题......

  • 在 URL 中包含主机时,它需要以 . 作为前缀//

    var cam = "//localhost:4003/count";
    

    否则,它将被视为localhost:4003具有目录名称的相对路径。

  • 使用 Ajax 时,您还必须处理同源策略。

    因此,如果您尝试使用file://该页面,这通常不会很好地工作。该FILE协议没有来源,因此无法通过 SOP,导致类似以下错误:

    Origin null is not allowed by Access-Control-Allow-Origin.
    

    最简单的解决方案是也从应用程序提供页面。

    您可以使用static()中间件来做到这一点。

    // `GET /` will serve `./public/index.html`
    app.use(express.static(__dirname + '/public'));
    

    或者使用另一个发送文件本身的路由。

    app.get('/', function (req, res) {
        res.sendfile(__dirname + '/public/index.html');
    });
    

    然后,从以下位置访问该页面:

    http://localhost:4003/
    
  • 此外,由于页面和count现在都来自同一来源,URL 可以简单地是相对于根的:

    var cam = "/count";
    
于 2013-08-24T02:15:07.353 回答
2

在你尝试alert(resp)的时候resp变量还没有被赋值,因为onreadystatechange还没有被调用。如果您将警报移入onreadystatechange,您应该会获得所需的效果。这也是您可以将该值分配给Element页面中的一个点。

于 2013-08-24T01:34:59.290 回答