【问题标题】:node.js, express and different portsnode.js, express 和不同的端口
【发布时间】:2012-04-23 04:01:51
【问题描述】:

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

有没有办法解决这个问题?

谢谢

【问题讨论】:

  • 我理解你的问题的方式是,你从 localhost:8888 加载一个网页,然后对 localhost:1337 进行 $.ajax 调用。那是对的吗?如果是这样,那么您将使用相同的来源政策。
  • 没错。所以解决这个问题的唯一方法是在 node.js 服务器上运行我的网站,使其具有相同的端口?但是,如果我在托管在端口 80 上的网站上直播,并且我想连接到 node.js 服务器以发出诸如搜索之类的请求,该怎么办?大多数人是怎么做到的?
  • 首选方法(恕我直言)是使用反向代理,使所有请求都转到相同的主机/端口并在后台重新路由它们。一个不常见的解决方法是使用 JSONP,但我个人不喜欢它,因为它涉及安全问题。
  • 正如@BarendGarvelink 提到的,您应该在这种情况下使用反向代理。

标签: node.js express


【解决方案1】:

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

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

server.enable("jsonp callback");

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

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

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

dataType: "jsonp", 

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2018-03-06
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多