2016-03-28 25 views
5

Dopo aver esaminato più post nello stack, non sono riuscito a trovare una risposta corretta.nodo CORS js problema

Controllato anche la documentazione sull'estensione CORS.

Ho il seguente codice server installato e funzionante:

var WebSocketServer = require("ws").Server 
var http = require("http") 
var express = require('express') 
var cors = require('cors') 
var app = express(); 

app.use(cors()); 
var port = process.env.PORT || 9000 

var server = http.createServer(app) 
server.listen(port) 
var count = 0; 
var clients = {}; 
var rooms = {}; 
var wss = new WebSocketServer({server: server}) 
wss.on("connection", function(ws) { 
    ws.on("create-room", function(data) { 
     rooms[data] = {creator : data.user_id, created : new Date()} 
    }) 
    ws.on("close", function() { 
     console.log("websocket connection close") 
    }) 
}) 

ma ottengo:

XMLHttpRequest non può caricare http://localhost:9000/socket.io/?EIO=3&transport=polling&t=LE-CbU0. Un carattere jolly "*" non può essere utilizzato nell'intestazione "Access-Control-Allow-Origin" quando il flag delle credenziali è true. L'origine 'http://localhost:8100' non è quindi consentita l'accesso. La modalità di credenziali di un XMLHttpRequest è controllata dall'attributo withCredentials.

Se io commento la linea con app.use(cors());

ottengo:

XMLHttpRequest non può caricare http://localhost:9000/socket.io/?EIO=3&transport=polling&t=LE-Cwb8. No L'intestazione 'Access-Control-Allow-Origin' è presente sulla risorsa richiesta. L'origine "http://localhost:8100" non è pertanto consentita per l'accesso . La risposta ha avuto codice di stato HTTP 404.

Quindi, chiaramente il mio server è installato e funzionante ok, ma

risposta

8

Come il messaggio di errore dice, l'origine jolly Access-Control-Allow-Origin non può essere utilizzato con Access-Control-Allow-Credentials. Per impostazione predefinita, il modulo cors utilizza un'origine di tipo selvaggio e, per impostazione predefinita, socket.io richiede credenziali (o almeno così sembra qui). Quello che devi fare è leggere l'intestazione Origin della richiesta e includerla nella risposta Access-Control-Allow-Origin.

Fortunatamente, cors rende molto semplice: per riflettere l'origine della richiesta, passare un oggetto opzioni con una proprietà origin: true. È inoltre necessario un immobile credentials: true per consentire le credenziali a tutti:

app.use(cors({ 
    origin: true, 
    credentials: true 
})); 
+0

Grazie per la risposta, ora ho 'Credenziali bandiera è 'vero', ma il 'Access-Control-Allow-credenziali' colpo di testa e '''' –

+0

Grazie, hai fatto il trucco :). Sono nuovo a questo –

+0

Una domanda però, ora ottengo 404 quando il browser chiama l'url però ... Se rimuovo la soluzione ottengo l'errore cors ... È confuso ... –