node.js,express和不同的端口

Ben*_*air 5 node.js express

我一直在玩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);
    }
});
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我的node.js服务器正在http:// localhost:1337 /上运行.因此,没有任何东西被返回,它正在抛出一个错误.

有没有解决的办法?

谢谢

Tho*_*low 6

您遇到的问题是您正在尝试进行跨源请求,并且浏览器不允许这样做(是的,具有不同端口的相同主机名为此目的计为不同的源).这里有三个选项:

1.代理请求.

如果可以,请做这个.编写一些在:8888服务器上运行的代码,代理对1337的请求.你也可以通过在他们两个面前贴一个代理来做到这一点,像Nginx这样的东西很擅长这个并且易于设置

2.使用CORS(跨源资源共享)

请参阅:http://en.wikipedia.org/wiki/Cross-origin_resource_sharinghttps://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);
Run Code Online (Sandbox Code Playgroud)

3.使用JSONP

这是一个把你的"AJAX"响应编码为Javascript代码的技巧.然后你要求浏览器加载该代码,浏览器将愉快地加载跨源脚本,这样就可以解决跨源问题.它也让其他人也可以绕过它,所以请确保这就是你想要的!

在服务器端,您需要在Javascript函数调用中包装您的响应,如果您启用"jsonp callback"选项,express可以自动执行此操作:

server.enable("jsonp callback");
Run Code Online (Sandbox Code Playgroud)

然后使用"json()"响应方法发送您的响应:

server.get("/ajax", function(req, res) {
    res.json({foo: "bar"});
});
Run Code Online (Sandbox Code Playgroud)

在客户端,只需在dataType选项中将"json"更改为"jsonp",就可以在jQuery中启用JSONP:

dataType: "jsonp", 
Run Code Online (Sandbox Code Playgroud)