javascript - express + socket.io 跨域

标签 javascript node.js sockets

我如何为 express.io 启用跨域,因为我需要一个 cordova 应用程序,chrome 说“请求的资源上没有'Access-Control-Allow-Origin' header 。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 和 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的回答的转载

关于javascript - express + socket.io 跨域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28434790/

相关文章:

node.js - 使用 array.map 后如何运行函数?

node.js - 如何从 nodejs 中的远程 url 创建可读流?

与大写字母相关的Javascript正则表达式无限循环

java - 使用套接字的 HTTP 响应中的随机字符

linux - 为什么在没有调用 Close() 或 Shutdown() 时发送 RST?

javascript - 使循环不挂起浏览器

javascript - 为什么 onmouseover() 函数可以与属性 onmouseover ="javascript code"一起使用,但不能与 addEventListener() 函数一起使用?

javascript - 没有哈希的主干路由?

sockets - 套接字安全无视嗅探

jquery 元素寻址的 javascript 替代方案