在NodeJS中启用CORS

时间:2014-11-11 02:24:44

标签: javascript node.js cors

我在带有IP的机器SERVER上运行了一个NodeJS服务器。 NodeJS服务器代码有效。例如,我可以使用以下telnet命令

进行连接
telnet <ip_server> <port>

或通过curl

curl -d "{}" "http://<ip_server>:<port>/"

我需要使用IP通过另一台机器CLIENT访问。但是,telnet无法连接,curl会返回connection refused错误。只能从CLIENT ping SERVER。从长远来看,我需要从CLIENT浏览器中加载的Javasrcipt代码访问SERVER。在Firefox中执行此操作时,我可以在Developer Console中看到以下错误消息

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://<ip_server>:<port>/. This can be fixed by moving the resource to the same domain or enabling CORS.

在过去的几个小时里,我一直在尝试在NodeJS服务器代码中启用CORS。我尝试了各种版本,我在网上找到了这个

...
var express = require('express');
var cors = require('cors')
...

var app = express();

 // Version A
app.all('/*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

// Version B
app.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
  res.setHeader('Access-Control-Allow-Credentials', true);
  next();
});


// Version C (using the "cors" package)
app.use(cors());
app.options('*', cors());

但似乎没有任何区别。虽然telnetcurl命令在从SERVER调用时有效,但从CLIENT尝试时无效。我在这里想念什么?

(我知道阻止跨域请求是一种鼓励的安全机制。但是,这是一个纯粹的实验性设置,我需要一个虚拟机(CLIENT)可以访问我的本地PC(SERVER)运行NodeJS服务器代码。)

编辑:作为请求,下面是相关的客户端代码片段。我使用NodeJS代码进行HTTP访问并连接到WebSocket。正如我所提到的,所有这些都从CLIENT运行良好

...
doAjaxRequest : function(serverUrl, method, data, callback) {    
  $.ajax({
    url: serverUrl, type: method, data: data, dataType: "json",
    success: function(response, textStatus, jqXHR){ callback(response); },
    error: function(jqXHR, textStatus, errorThrown){ },
  });
},

updateBoundingBox : function(endpoint, lat1, lng1, lat2, lng2) {
  var url = "http://<ip_server>:<port_http>/...";
  this.doAjaxRequest(url, "post", { }, Utility.bind(this, this.onBoundingBoxUpdated));
},

...

if ("WebSocket" in window) {
  websocket = new WebSocket("ws://<ip_server>:<port_ws>/");
}

EDIT2:以下是从CLIENT访问SERVER的不同方式获得的错误消息:

// Browser
// Connect to WebSocket
Firefox can't establish a connection to the server at ws://<ip_server>:<port_websocket>/
// HTTP Request
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://<ip_server>:<port_http>/. This can be fixed by moving the resource to the same domain or enabling CORS.


// TELNET
$ telnet <ip_server> <port_http>
Trying <ip_server>...
telnet: Unable to connect to remote host: Connection refused


// CURL
curl -d "{}" "http://<ip_server>:<port_http>/"
curl: (7) Failed to connect to <ip_server> port <port_http>: Connection refused


// ping <ip_server> (works fine)

一个问题可能是客户&#34;变化&#34;。 telnet和&#39; curl&#39;我直接从具有本地IP(192.168.xxx.xxx)的虚拟机调用。使用浏览器时,CLIENT在具有全局IP的路由器/代理计算机上运行。当我尝试执行`telnet&#39;并且&#39; curl&#39;在路由器/代理机器上,但命令只是挂起。他们没有连接,但我也没有得到任何连接拒绝错误。

1 个答案:

答案 0 :(得分:0)

有时候,人们必须首先寻找最简单的解决方案。在裁决(几乎)其他任何事情后,我最终检查了任何防火墙问题。确实在客户端安装了ufw。在我允许访问所需的端口后,一切都顺利进行。

感谢所有评论!他们肯定让我继续寻找并最终朝着正确的方向前进。