Javascript 在NodeJS中启用CORS
我有一个NodeJS服务器运行在具有IP的机器服务器上。NodeJS服务器代码可以正常工作。例如,我可以使用以下telnet命令进行连接 我需要通过另一台具有IP的机器客户端进行访问。但是,telnet不会连接,curl返回一个连接被拒绝错误。只有从客户端ping服务器才能工作。从长远来看,我需要从客户端浏览器中加载的Javasrcipt代码访问服务器。在Firefox中执行此操作时,我可以在开发人员控制台中看到以下错误消息Javascript 在NodeJS中启用CORS,javascript,node.js,cors,Javascript,Node.js,Cors,我有一个NodeJS服务器运行在具有IP的机器服务器上。NodeJS服务器代码可以正常工作。例如,我可以使用以下telnet命令进行连接 我需要通过另一台具有IP的机器客户端进行访问。但是,telnet不会连接,curl返回一个连接被拒绝错误。只有从客户端ping服务器才能工作。从长远来看,我需要从客户端浏览器中加载的Javasrcipt代码访问服务器。在Firefox中执行此操作时,我可以在开发人员控制台中看到以下错误消息 Cross-Origin Request Blocked: The S
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.
但似乎没有什么不同。虽然telnet和curl命令在从服务器调用时可以工作,但在从客户机尝试时却无法工作。我错过了什么
我知道阻止跨域请求是一种受鼓励的安全机制。然而,这是一个纯粹的实验设置,我需要一个虚拟机客户端来访问运行NodeJS服务器代码的本地PC服务器
编辑:根据要求,下面是相关客户机代码片段的imho。我将NodeJS代码用于HTTP访问和连接到WebSocket。正如我所提到的,从客户端开始,一切都运行良好
...
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:以下是我从从客户端访问服务器的不同方式中得到的错误消息:
// 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)
一个问题可能是,客户的情况各不相同。telnet和“curl”我直接从本地IP为192.168.xxx.xxx的虚拟机调用。使用浏览器时,客户端在具有全局IP的路由器/代理计算机上运行。当我试图在路由器/代理机器上执行'telnet'和'curl'时,命令只是挂起。他们没有连接,但我也没有收到任何连接被拒绝的错误。有时候,人们真的必须首先寻找最简单的解决方案。在排除了几乎所有其他因素后,我最终检查了所有防火墙问题。实际上,客户机上安装了ufw。在我允许访问所需的端口后,一切都很顺利
谢谢大家的评论!他们肯定让我一直在搜索,最终找到了正确的方向。您的服务器代码似乎正确,请向我们展示您的客户端JS。我添加了一些客户端代码片段。除了JS代码外,telnet和curl已经无法连接。此站点可能会有所帮助:可能重复So等待,客户端上运行的浏览器会出现CORS错误,但客户端的telnet和curl会拒绝连接?
...
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());
...
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>/");
}
// 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)