Node.js 两台nodejs服务器上的访问控制允许源错误

Node.js 两台nodejs服务器上的访问控制允许源错误,node.js,socket.io,cross-domain-policy,Node.js,Socket.io,Cross Domain Policy,我在从nodeJs服务器生成的页面到另一个通过socket.IO侦听的nodeJs服务器的socket IO连接上遇到问题 该理念包含两项任务: 通过一台Express服务器生成HTML模板 支持其他express服务器的套接字io 下面是server.js代码: const app = require('express'); const util = require('util'); const http = require('http'); const fs = require('fs');

我在从nodeJs服务器生成的页面到另一个通过socket.IO侦听的nodeJs服务器的socket IO连接上遇到问题

该理念包含两项任务: 通过一台Express服务器生成HTML模板 支持其他express服务器的套接字io

下面是server.js代码:

const app = require('express');
const util = require('util');
const http = require('http');
const fs = require('fs');
const debug = console.log;
const moment = require('moment');
const event = require('events').EventEmitter;
var server = app();
server.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();
    }
);
server.use(app.json());
server.use(app.urlencoded());
server.use(app.logger());
server.use(app.favicon());
server.use(app.static(__dirname + '/core'));
server.get('*', function (req, res, next) {
    debug('Connection refused: \t' + req.url);
    var r = (e.url.split('/')[2] == 'socket.io.js') ? server.st.socket : server.st.tmp; // Return TMP-HTML FILE OR SOCKET.IO JS FILE FOR CLIENT
    res.send(r);
    res.end();
});
server.st = {
        socket: fs.readFileSync('./socket.io.js', 'utf-8')
        tmp: fs.readFileSync('./tmp.html', 'utf-8')
}
server.listen(81);
*******************************************************************************
//Creating SOCKET server
    io = require('socket.io').listen(82);
    io.configure(function () {
        io.set('log level', 1);
        io.set('origin', '*');
    });
    io.sockets.on('connection', function (socket) {
        debug('IT IS WORK')
    })
以下是tmp.html代码:

<!DOCTYPE html>
<html>
<head>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect('http://localhost:82');
    </script>
</head>
<body>
</body>

这有什么问题?

您正在使用端口81创建express套接字,然后在端口82上为socket.io创建另一个套接字,然后从前端尝试从express加载socket.io.js,而express不为其提供服务(您应该将socket.io绑定到与express相同的服务器),然后,您尝试连接到端口82的
http
协议-该端口被视为另一个域,对于CORS将失败

不要试图一段一段地编写代码,并期望它能够工作,在使用它之前,您必须了解它的功能,否则您将走不远

请按照官方网站上的socket.io示例进行express:


更新:根据您在评论中提到的需求,您需要另一个域,您可能需要检查其他2个选项:代理来自提供htmls的域的WS-traffic,或者使用能够很好地处理CORS的替代方案,例如SockJS

您正在使用端口81创建express socket,然后在端口82上为socket.io创建另一个套接字,然后从前端尝试从express加载socket.io.js,而它不提供服务(您应该将socket.io绑定到与express相同的服务器),然后尝试连接到端口82的
http
协议,该端口被视为另一个域,而且会因为CORS而失败

不要试图一段一段地编写代码,并期望它能够工作,在使用它之前,您必须了解它的功能,否则您将走不远

请按照官方网站上的socket.io示例进行express:

更新:根据您在评论中提到的需求,您需要另一个域,您可能需要检查其他2个选项:代理来自提供htmls的域的WS-traffic,或者使用能够很好地处理CORS的替代方案,例如SockJS

答案是:

必须支持套接字的HTTP服务器,在股票套接字选项中具有默认原点设置,这不能由778行(v0.9)中的var IO configurate、manager.js更改,您必须在原点选项中写入如下内容: 标题['Access-Control-Allow-Origin']='*'; 或

最好的解决方法是:

HTTP服务器必须支持socket,它将地址与自己的侦听器绑定在一起,创建了一个socket客户端,该客户端使用socket.io.js文件请求这个隧道,该文件是我从localhost:81获取的。。 这就是为什么我问自己:“为什么我从服务器获取套接字客户机文件,而这与套接字服务器无关?” 改变

<script src="http://localhost:82/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect('http://localhost:82');
</script> 

var socket=io.connect('http://localhost:82');
它是有效的。THX,来自俄罗斯的挚爱。再见

答案是:

必须支持套接字的HTTP服务器,在股票套接字选项中具有默认原点设置,这不能由778行(v0.9)中的var IO configurate、manager.js更改,您必须在原点选项中写入如下内容: 标题['Access-Control-Allow-Origin']='*'; 或

最好的解决方法是:

HTTP服务器必须支持socket,它将地址与自己的侦听器绑定在一起,创建了一个socket客户端,该客户端使用socket.io.js文件请求这个隧道,该文件是我从localhost:81获取的。。 这就是为什么我问自己:“为什么我从服务器获取套接字客户机文件,而这与套接字服务器无关?” 改变

<script src="http://localhost:82/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect('http://localhost:82');
</script> 

var socket=io.connect('http://localhost:82');

它是有效的。THX,来自俄罗斯的挚爱。再见

但这就是重点。我需要2个网络服务器。一个用于生成模板和呈现静态文件。第二个必须支持web套接字,它必须适用于与任何其他域的所有连接。这篇文章我读了很多遍,但答案并不是这样。主要的问题是,当从“io=require('socket.io')使用createServer()的stock HTTP模块时;对CORS没有反应。但如果手动创建服务器,并将requestListener作为express应用程序,它工作得很好,但socket.io不会监听它。还有更多。我正在使用node,因为它是0.6版本。由于安全性和强制措施,您将无法实现从一个域到另一个域的WS-connection-浏览器将不允许这样做,无论标题如何。您可能希望选中其他选项:在同一个域上代理WS,或者选中SockJS,这意味着要在开箱即用的情况下使用CORS:但这就是重点。我需要2个网络服务器。一个用于生成模板和呈现静态文件。第二个必须支持web套接字,它必须适用于与任何其他域的所有连接。这篇文章我读了很多遍,但答案并不是这样。主要的问题是,当从“io=require('socket.io')使用createServer()的stock HTTP模块时;对CORS没有反应。但如果手动创建服务器,并将requestListener作为express应用程序,它工作得很好,但socket.io不会监听它。还有更多。我正在使用node,因为它是0.6版本。由于安全性和强制措施,您将无法实现从一个域到另一个域的WS-connection-浏览器将不允许这样做,无论标题如何。您可能希望选中其他选项:在同一个域上代理WS,或者选中SockJS,这意味着要在开箱即用的情况下使用CORS: