【问题标题】:express + socket.io cross domainexpress + socket.io 跨域
【发布时间】:2015-04-10 16:03:57
【问题描述】:

如何为 express.io 启用跨域,因为我需要一个 cordova 应用程序,chrome 说“请求的资源上没有 'Access-Control-Allow-Origin' 标头。来源”,这是我的代码。

服务器

var app = require('express.io')();
app.http().io()

app.listen(2000);
app.io.set('origins', '*:*');
app.io.set('transports', [
    'websocket'
    , 'flashsocket'
    , 'htmlfile'
    , 'xhr-polling'
    , 'jsonp-polling'
]);

app.get('/', function (req, res) {
  res.setHeader('Access-Control-Allow-Origin','*');
  res.send(200, 'Todo fino');

  req.io.route('connection');
});

app.io.route('connection', function (req) {
  console.log('User connected');
});

客户

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
<script src="https://cdn.socket.io/socket.io-1.3.3.js"></script>
  <script>
  var socket = io.connect('http://localhost:2000');

  </script>
  <title>Document</title>
</head>
<body>
  Probando Socket system
</body>
</html>

【问题讨论】:

  • Express.io 已经过时了。您的 socket.io 客户端版本是 1.3.3,而 express.io 仍然在 0.9.16 上运行,它们不向后兼容。
  • 我在使用最新版本的sailsjs时遇到了同样的错误。与 config.sockets 起源:' * : * ',
  • 尝试添加 res.header("Access-Control-Allow-Headers", "Content-Type");

标签: javascript node.js sockets


【解决方案1】:

我从未使用过它,但这是我分别使用 Express 和 Socket.io 设置它的方式。

**Socket.IO 版本 --> 1.3.7 ** **Express 版本 --> 4.13.3 **

选项 1:仅强制使用 Websockets

默认情况下,websockets 是跨域的。如果您强制 Socket.io 仅将其用作连接客户端和服务器的方法,那么您就可以开始了。

服务器端

//HTTP Server 
var server = require('http').createServer(app).listen(8888);
var io = require('socket.io').listen(server);

//Allow Cross Domain Requests
io.set('transports', [ 'websocket' ]);

客户端

var connectionOptions =  {
            "force new connection" : true,
            "reconnectionAttempts": "Infinity", //avoid having user reconnect manually in order to prevent dead clients after a server restart
            "timeout" : 10000, //before connect_error and connect_timeout are emitted.
            "transports" : ["websocket"]
        };

 var socket = io("ur-node-server-domain", connectionOptions);

就是这样。问题?不适用于不支持 websockets 的浏览器(对于客户端)。有了这个,你几乎可以扼杀 Socket.io 的魔力,因为它逐渐从长轮询开始,然后升级到 websockets(如果客户端支持的话)。

如果您 100% 确定您的所有客户端都将使用兼容 HTML5 的浏览器进行访问,那么您就可以开始了。

选项 2:在服务器端允许 CORS,让 Socket.io 处理是使用 websockets 还是长轮询。

对于这种情况,您只需要调整服务器端设置。客户端连接一如既往。

服务器端

//HTTP Server 
var express=require('express');
//Express instance
var app = express();

//ENABLE CORS
app.all('/', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
 });

就是这样。希望它可以帮助其他人。

ps:这是我对另一个问题的回答的转贴,Cross-domain connection in Socket.IO

【讨论】:

  • CORS 对我不起作用。问题,这将是什么最终游戏?我在想它会像客户端 URL 是“clienurl.com”,访问 socketio 会像 serverurl.com:9000/socket.io/socket.io.js.. 我对此是否正确?
  • 你的意思是 CORS 的最终结果是什么?
【解决方案2】:

尝试使用CORS,例如:

var cors = require('cors');
app.use(cors({
    origin: true,
    credentials: true
}));

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 2017-08-15
    • 2014-03-10
    • 2012-07-16
    • 2017-05-18
    • 2012-02-16
    • 2014-12-27
    • 2013-10-13
    • 1970-01-01
    相关资源
    最近更新 更多