2015-02-10 141 views
3

如何爲express.io啓用跨域,因爲我需要一個cordova應用,chrome說「No」Access-Control-Allow-Origin'標頭存在於請求的資源中。 「,這是我的代碼。express + socket.io跨域

服務器

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> 
+0

Express.io是非常過時。你的socket.io客戶端版本是'1.3.3',而express.io仍然在'0.9.16'上運行,它們不是向後兼容的。 – 2015-02-10 15:01:45

+0

使用最新版本的sailsjs時出現同樣的錯誤。 config.sockets起源:'*:*', – pedronalbert 2015-02-10 15:15:35

+0

嘗試添加res.header(「Access-Control-Allow-Headers」,「Content-Type」); – pratiklodha 2015-02-10 16:16:05

回答

0

嘗試使用CORS,例如:

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

我從來沒有使用的,但是這是我如何設置它使用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的魔法,因爲它逐漸開始了長輪詢,以後升級到websocket(如果客戶端支持它)。

如果您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

+0

CORS不適合我。問題是什麼?我認爲這將是像在客戶端URL是「clienurl.com」,並訪問socketio會像http://serverurl.com:9000/socket.io/socket.io.js ..我對此是否正確? – oneofakind 2015-12-07 11:00:45

+0

CORS的最終遊戲是什麼? – Chayemor 2016-11-30 21:01:28