簡體   English   中英

express + socket.io跨域

[英]express + socket.io cross domain

如何為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和Socket.io進行設置的方法。

** Socket.IO版 - > 1.3.7 ** **快遞版 - > 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:這是我對Socket.IO中另一個問題, 跨域連接的答案的轉貼

嘗試使用CORS,例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM