我一直在玩node.js,然后遇到了快速框架 . 当使用不同的端口时,我似乎无法使其工作 .
我在http://localhost:8888上有我的ajax,这是我在Mac上运行的MAMP服务器 .
$.ajax({
url: "http://localhost:1337/",
type: "GET",
dataType: "json",
data: { },
contentType: "application/json",
cache: false,
timeout: 5000,
success: function(data) {
alert(data);
},
error: function(jqXHR, textStatus, errorThrown) {
alert('error ' + textStatus + " " + errorThrown);
}
});
正如您所看到的,我的node.js服务器正在http://localhost:1337/上运行 . 因此,没有任何东西返回,它正在抛出一个错误 .
有没有解决的办法?
谢谢
本
1 回答
您遇到的问题是您正在尝试进行跨源请求,并且浏览器不允许这样做(是的,具有不同端口的相同主机名为此目的计为不同的源) . 你有三个选择:
1. Proxy the request.
如果可以,请这样做 . 编写一些在:8888服务器上运行的代码,代理对1337服务器的请求 . 你也可以通过在他们两个面前贴一个代理来做到这一点,像Nginx这样的东西很擅长这个并且易于设置
2. Use CORS (Cross Origin Resource Sharing)
见:http://en.wikipedia.org/wiki/Cross-origin_resource_sharing和https://developer.mozilla.org/en/http_access_control
这意味着在您的回复中添加一些 Headers ,以告诉浏览器这里的跨源请求是正确的 . 在您的Express服务器中添加如下的中间件:
3. Use JSONP
这是一个把你的“AJAX”响应编码为Javascript代码的技巧 . 然后你要求浏览器加载该代码,浏览器将愉快地加载脚本跨源,这样就可以解决跨源问题 . 它也让其他任何人都可以绕过它,所以要确保这就是你想要的!
在服务器端,您需要在Javascript函数调用中包装您的响应,如果您启用“jsonp callback”选项,express可以自动执行此操作:
然后使用“json()”响应方法发送您的响应:
在客户端,您可以通过在dataType选项中将“json”更改为“jsonp”来在jQuery中启用JSONP: