两个nodejs服务器上的Access-Control-Allow-Origin错误

时间:2014-02-18 16:37:20

标签: node.js socket.io cross-domain-policy

我遇到了来自页面的套接字IO连接问题,由nodeJs服务器生成,到另一个由Socket.IO监听的nodeJs服务器

这个想法包含两个任务:  由一台Express服务器生成HTML模板  由另一个快速服务器支持套接字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>

默认为客户端的Socket.io.js

这是客户端的错误

XMLHttpRequest cannot load http://localhost:82/socket.io/?EIO=2&transport=polling. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:81' is therefore not allowed access. 

这有什么问题?

2 个答案:

答案 0 :(得分:5)

答案是:

必须支持套接字的HTTP服务器,在库存套接字选项中有默认的原始设置,不能通过var IO configurate,manager.js在778行(v0.9)中更改,你必须写入这样的原始选项:      headers ['Access-Control-Allow-Origin'] ='*'; OR

解决方案的最佳方式是:

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

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

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

答案 1 :(得分:0)

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

不要试图逐个敲打代码并期望它能够工作,你必须先了解它的作用,然后才能使用它,否则你就不会走得太远。

请在官方网站上关注socket.io的示例:http://socket.io/#how-to-use

更新:根据您在评论中提到需求,您需要另一个域,您可能需要检查其他两个选项:从提供htmls的域代理WS流量或使用在CORS中做得很好的替代方案,如 SockJS