6

我一直在玩 node.js,然后遇到了 express 框架。当使用不同的端口时,我似乎无法让它工作。

我在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/上运行。结果什么都没有返回,它抛出了一个错误。

有没有解决的办法?

谢谢

4

1 回答 1

7

您遇到的问题是您正在尝试发出跨域请求,并且浏览器不允许这样做(是的,具有不同端口的相同主机名被视为不同的来源)。您在这里有三个选择:

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 回调”选项,express 可以自动执行此操作,如下所示:

server.enable("jsonp callback");

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

server.get("/ajax", function(req, res) {
    res.json({foo: "bar"});
});

在客户端,您只需在 dataType 选项中将“json”更改为“jsonp”即可在 jQuery 中启用 JSONP:

dataType: "jsonp", 
于 2012-04-22T20:01:51.160 回答