首页 文章

node.js,express和不同的端口

提问于
浏览
4

我一直在玩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 回答

  • 5

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

    1. Proxy the request.

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

    2. Use CORS (Cross Origin Resource Sharing)

    见:http://en.wikipedia.org/wiki/Cross-origin_resource_sharinghttps://developer.mozilla.org/en/http_access_control

    这意味着在您的回复中添加一些 Headers ,以告诉浏览器这里的跨源请求是正确的 . 在您的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. Use 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",
    

相关问题