在与域相同的计算机上运行的NODEJS服务器的CORS错误

时间:2015-04-07 19:43:43

标签: javascript php ajax node.js cors

我在我的机器上运行了一个NodeJS服务器,我试图用在同一台机器上运行的网站上的ajax访问它。我收到了一个跨域错误: XMLHttpRequest无法加载http://localhost:3000/games。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许原点“http://localhost”访问。

我在这台机器上访问了一个不同的api,用php运行,地址是 http://localhost/games

我的想法是因为nodejs服务器在与apache不同的端口上运行导致跨域问题?

任何见解都会很棒,对于api开发并不熟悉,也不确定从何处开始。

有人建议我尝试使用JSONP,但我不确定这是否在技术上需要,因为api在同一台机器上运行?

2 个答案:

答案 0 :(得分:2)

原点被定义为URI方案,主机名和端口号的组合,因此您确实违反了从http://localhosthttp://localhost:3000执行XMLHttpRequest的相同原始策略

我对nodejs不是很熟悉,但我看到了五个选项:

  • 显然,最简单的事情就是在同一个端口上运行所有内容,不确定您的方案是否可行。
  • 使用JSONP(仅对GET请求有效)
  • 实施CORS标头(它与IE有一些兼容性问题< = 9 + other corner case anomalies
  • 实施代理以始终与客户端http://localhost进行通信。让代理处理http://localhost:3000并将响应返回给客户端。
  • 使用替代方法执行跨域请求XDomain

答案 1 :(得分:1)

由于您需要能够发送POST请求,因此您唯一的选择是:

  • 实施CORS
  • 反向代理
  • php代理(或您用于提供HTML页面的任何语言)

如果您使用快递,最简单的方法是实施CORS。大多数工作都是为您完成的,您需要做的就是包含cors模块并将其作为中间件附加。

反向代理是下一个要查看的解决方案。它的作用是将所有请求带到给定的域或域/文件夹,并将它们重新路由到指定的域,在这种情况下,您的节点服务器在不同的端口上运行。例如,您可以将所有请求路由到http://localhost/apihttp://localhost:3000。研究您正在使用的网络服务器的Reverse Proxy

第三种解决方案是让服务html的web服务器也向节点服务器发送请求。我认为这对我的口味有点过于讨厌,因为上述两个解决方案很容易实现,并且不会向html网络服务器添加额外的代码。但是,如果您没有拥有目标网络服务器,那么如果目标网络服务器不支持CORS,这将是唯一的选择。