我一直在玩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/上运行。因此,没有任何东西被返回,它正在抛出错误。
有解决方法吗?
由于
本
答案 0 :(得分:6)
您遇到的问题是您正在尝试进行跨源请求,并且浏览器不允许这样做(是的,具有不同端口的相同主机名为此目的计为不同的来源)。你有三个选择:
<强> 1。代理请求。
如果可以,请执行此操作。编写一些在:8888服务器上运行的代码 代理请求1337的请求。你也可以这样做 在他们两个面前坚持代理,就像Nginx一样 相当擅长这个并且易于设置
<强> 2。使用CORS(跨源资源共享)
请参阅:http://en.wikipedia.org/wiki/Cross-origin_resource_sharing和https://developer.mozilla.org/en/http_access_control
这意味着在您的回复中添加一些标题,告诉浏览器这里的跨源请求是可以的。在您的Express服务器中添加如下的中间件:
function enableCORSMiddleware (req,res,next) {
// You could use * instead of the url below to allow any origin,
// but be careful, you're opening yourself up to all sorts of things!
res.setHeader('Access-Control-Allow-Origin', "http://localhost:8888");
next()
}
server.use(enableCORSMiddleware);
第3。使用JSONP
这是一个将“AJAX”响应编码为Javascript代码的技巧。然后你要求浏览器加载该代码,浏览器将愉快地加载跨源脚本,这样就可以解决跨源问题。它也让其他人也可以绕过它,所以要确保这就是你想要的!
在服务器端,您需要在Javascript函数调用中包装您的响应,如果您启用“jsonp callback”选项,express可以自动执行此操作:
server.enable("jsonp callback");
然后使用响应的“json()”方法发送您的回复:
server.get("/ajax", function(req, res) {
res.json({foo: "bar"});
});
在客户端,只需在dataType选项中将“json”更改为“jsonp”,即可在jQuery中启用JSONP:
dataType: "jsonp",