我对很多这类东西还很陌生,并且正在设法弄清楚。
我在<my.domain.com>
有一个托管域。我在此地址托管了一个游戏,用户可以访问该地址,然后该游戏就会在浏览器中加载。
在同一台服务器上,我正在运行Express nodejs(我们称为HTTP SERVER
)服务器来接收HTTP请求。
我还在同一台服务器上使用Socket.io(我们称为SOCKET SERVER
)库运行套接字服务器。
HTTP SERVER
可以通过SOCKET SERVER
连接到localhost:<port>
,并且可以来回通信。我可以将请求从移动设备发送到HTTP SERVER
,后者将这些请求转发到SOCKET SERVER
,并在移动设备上获得响应。
我现在的问题是我需要从托管游戏SOCKET SERVER
到<my.domain.com>
建立另一个连接。但是,当我尝试从localhost:<port>
连接到HTTP SERVER
时,出现ERR_CONNECTION_REFUSED错误。我假设这与主机名不同有关。我尝试添加
app.use(function(req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
});
但这似乎无济于事。我不太确定该从哪里去。
套接字服务器app.js
const app = require('express')();
const server = require('http').Server(app);
const io = require('socket.io')(server);
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
});
server.listen(8082);
io.on('connection', (socket) => {
console.log(`Socket server 'connection' event`);
});
HTTP SERVER
中的代码可以正确连接和发送/接收消息
var socket = require('socket.io-client')('http://localhost:8082');
socket.on('connect', () => {
console.log(`HTTP server - 'connect' event to socket server`);
});
这是一个JavaScript文件,游戏将其作为加载项加载。挂钩由游戏作为EventEmitter提供。我无法直接访问游戏显示的HTML页面,尽管可以通过此javascript附加文件进行操作。
let socket;
// a game hook when it's initialized
Hooks.on("init", function() {
// don't have direct access to game pages, so create a script tag and load
// the socket.io client library
const scriptRef = document.createElement('script');
scriptRef.setAttribute('type', 'text/javascript');
scriptRef.setAttribute('onload', 'window.socketLibraryLoaded()');
scriptRef.setAttribute('src', 'https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js');
document.getElementsByTagName('head')[0].appendChild(scriptRef);
});
// handler for when library is loaded
window.socketLibraryLoaded = () => {
log('Socket library loaded');
// i assume this address is wrong since the host of the game is <my.domain.com> and it's trying to connect to localhost
socket = io('https://localhost:8082');
socket.on('connect', () => {
log('Connected to socket server');
});
socket.on('connect_error', error => {
log(error);
});
}
答案 0 :(得分:0)
因此,在将我的头撞在墙上超过10个小时之后,我终于找到了问题。当然还有一个简单的用户错误。
CORs错误并不是真正的问题。我收到该错误是因为NGINX代理发生错误,导致正确的标头无法发送回,因此浏览器显示了该错误。
问题在于,在我的NGINX配置中的某个地方,我使用的是127.0.0.0
而不是127.0.0.1