Node.js 两台nodejs服务器上的访问控制允许源错误
我在从nodeJs服务器生成的页面到另一个通过socket.IO侦听的nodeJs服务器的socket IO连接上遇到问题 该理念包含两项任务: 通过一台Express服务器生成HTML模板 支持其他express服务器的套接字io 下面是server.js代码: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');
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: