2016-03-01 16 views
3

我的節點服務器和客戶端在不同的端口上運行(分別爲3001,5347)。 在客戶端我用了,即使我允許在服務器上使用cors,Socket.io也會提供CORS錯誤

var socket = io('http://127.0.0.1:3001'); 

在服務器我嘗試了所有下面逐一

1) io.set('origins', '*:*'); 
    2) io.set('origins', 'http://127.0.0.1:5347'); 
    3) io.set('origins', '*'); 
    4) io.set('origins', '127.0.0.1:5347'); 

但我發現了以下錯誤:

XMLHttpRequest cannot load http://127.0.0.1:3001/socket.io/?EIO=3&transport=polling&t=1456799439856-4590 . A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'null' is therefore not allowed access.

注:我M使用服務器上的快遞,我已經在以下方式使用Cors中間件:

app.use(cors()); 

其中app和cors分別是express和cors的實例。

回答

10

如果運行快遞如下:

var app = express(); 
var server = app.listen(3000); 

所以要socket.io開始,我們可以做foollowing:

var io = require('socket.io').listen(server); 

問題是因爲下面的代碼:

var http = require('http').Server(app); 
var io = require('socket.io')(http); 

傳遞給socket.io的服務器對象與我正在偵聽的服務器對象不同。

1

錯誤說...

原因'空'因此是不允許訪問。

是否在請求中設置了主機頭?

設置主機頭應該可以解決這個

+0

你可以更具體的代碼,你在暗示什麼? –

0

如果您使用快遞,然後你的發球開始代碼之前定義這樣的中間件...

app.use(function(request, response, next) { 
    response.header("Access-Control-Allow-Origin", "*"); 
    response.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
    next(); 
}); 
+0

沒有工作,仍然收到相同的錯誤。 :( –

1

您需要配置節點服務器,以便它會使Access-Control-Allow-Origin標頭的值回顯Origin請求標頭的值。看到錯誤信息的這一部分:

A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'null' is therefore not allowed access.

你發送憑據在請求(使用XHR + withCredentials,或者在底層請求取+ credentials),並且在這種情況下,Access-Control-Allow-Origin響應標頭的值必須與請求中的Origin標頭的值完全匹配。


所有說,如果服務器說起源的null,看來你不能從Web服務器加載它,而是直接從文件系統來測試您的應用程序,因此它通過file:// URL結束。

如果是這樣,你可能真的不想這樣測試,而是應該在本地運行Web服務器並在測試時加載你的應用程序。

相關問題