0

我正在尝试从网络上的 javascript 代码到 Node.js 中的服务器进行简单的连接(请求 - 响应)。

我试图提出如下请求:

var request = new XMLHttpRequest();
request.open('GET', 'http://localhost:4444/', false);
request.send(); 

if (request.status === 200) {
  console.log(request.responseText);
}

运行此代码我在FireBug中遇到错误

我继续搜索,我发现这个方法只是在同一个域上发出 GET 请求。要进行跨域请求,我们必须使用其他策略。

我找到了一个jQuery 方法,看来我走对了:

$.get(
    'http://localhost:4444/',
    function(data) {
        alert("sucess"); 
        //Do anything with "data"
    }
);

在这种情况下,我得到相同的响应而没有错误

它似乎有效,但从未显示“警报”消息!发生什么了?我究竟做错了什么?

Node.js 服务器代码是:

var http = require("http");

http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("Response");
    response.end();
}).listen(4444);
4

3 回答 3

2

所以你遇到了跨域问题。你有几个选择:

1)由于您使用的是节点,请使用 socket.io 。它是跨域兼容的。

在客户端:

<script src="Full path to were socket IO is held on your server//socket.io.js"></script>
<script>
    var socket = io.connect();

    socket.on('some_callback', function(data){
        // receive data
    });

    socket.emit('some_other_callback', {'data': value}); //send data
</script>

服务器:

var io = require('socket.io').listen(server);

// define interactions with client
io.sockets.on('connection', function(socket){
    //send data to client
    socket.emit('some_callback', {'data': value});

    //recieve client data
    socket.on('some_other_callback', function(data){
        //do something
    }); 
});

2)既然你只想使用 GET 你可以使用 JSONP

$.getJSON('url_to_your_domain.com/?callback=?&other_data=something,
    function(data){
        //do something
    }
);

在这里,我们传递您的正常 GET 参数以及 callback=?。您将从您的服务器返回以下内容:

require('url');
var r = url.parse(req.url,true);
r.query.callback + '(' + some JSON + ')'

3)如果您不关心所有浏览器兼容性,您可以使用 CORS:您可以看到一个比我能在这里写的更好的示例

于 2012-08-08T23:45:41.443 回答
1

跨域 ajax 需要您的服务器的特殊支持。

要么 CORS:http ://en.wikipedia.org/wiki/Cross-origin_resource_sharing 并非所有浏览器都支持。它涉及请求和响应中的特殊标头,告诉浏览器允许一个域与另一个域进行通信,以及哪些数据。

或 JSONP:http ://en.wikipedia.org/wiki/JSONP WHich 可以在任何地方工作,但有一些实现限制。它涉及服务器将响应包装在 javascript 函数回调中,该回调将执行并传入您想要的数据。

无论哪种方式,都需要为这些方法中的每一种设置服务器。

于 2012-08-08T23:41:20.307 回答
0

我认为您的问题是Same Origin Policy。您的浏览器必须从 node.js 实例获取网页。

否则,您必须使用类似CORS的东西。SO上也有很好的问题:绕过同源政策的方法

于 2012-08-08T23:39:51.303 回答