node.js,express和不同的端口

时间:2012-04-22 08:07:30

标签: 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);
    }
});

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

有解决方法吗?

由于

1 个答案:

答案 0 :(得分: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);

第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",