Consenti richiesta CORS REST a un’applicazione Express / Node.js su Heroku

Ho scritto un’API REST sul framework express per node.js che funziona per le richieste dalla console js in Chrome e la barra degli URL, ecc. Ora sto provando a farlo funzionare per le richieste da un’altra app, su un altro dominio (CORS).

La prima richiesta, effettuata automaticamente dal front-end javascript, è to / api / search? Uri =, e sembra non riuscire nella richiesta OPZIONI “preflight”.

Nella mia app express, aggiungo le intestazioni CORS, usando:

var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With'); // intercept OPTIONS method if ('OPTIONS' == req.method) { res.send(200); } else { next(); } }; 

e:

 app.configure(function () { app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(allowCrossDomain); app.use(express.static(path.join(application_root, "public"))); app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); 

Dalla console di Chrome ottengo queste intestazioni:

URL richiesta: http: //furious-night-5419.herokuapp.com/api/search? Uri = http% 3A% 2F% 2Flocalhost% 3A5000% 2Follection% 2F1% 2Fdocuments% 2F1

Metodo di richiesta: OPZIONI

Codice di stato: 200 OK

Richiedi intestazioni

 Accept:*/* Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8 Access-Control-Request-Headers:origin, x-annotator-auth-token, accept Access-Control-Request-Method:GET Connection:keep-alive Host:furious-night-5419.herokuapp.com Origin:http://localhost:5000 Referer:http://localhost:5000/collections/1/documents/1 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5 

Parametri stringa di query

 uri:http://localhost:5000/collections/1/documents/1 

Intestazioni di risposta

 Allow:GET Connection:keep-alive Content-Length:3 Content-Type:text/html; charset=utf-8 X-Powered-By:Express 

Assomiglia a una mancanza di intestazioni corrette inviate dall’applicazione API?

Grazie.

Ho incoraggiato il tuo codice su un’app ExpressJS pulita e funziona perfettamente.

Prova a spostare la tua app.use(allowCrossDomain) nella parte superiore della funzione di configurazione.

per supportare i cookie conCredentials hai bisogno di questa riga xhr.withCredentials = true;

mdn docs xhr.withCredentials

Nel server Express aggiungi questo blocco prima di tutti gli altri

 `app.all('*', function(req, res, next) { var origin = req.get('origin'); res.header('Access-Control-Allow-Origin', origin); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); });` 

Non potrebbe essere il caso per la maggior parte delle persone che stanno navigando in questa domanda, ma ho avuto questo stesso identico problema e la soluzione non era correlata a CORS .

Si scopre che la string segreta del token Web JSON non è stata definita nelle variabili di ambiente, quindi il token non può essere firmato. Ciò ha causato a qualsiasi richiesta POST che si basa sul controllo o sulla firma di un token per ottenere un timeout e restituire un errore 503 , dicendo al browser che c’è qualcosa di sbagliato in CORS , che non lo è. L’aggiunta della variabile d’ambiente in Heroku ha risolto il problema.

Spero che questo aiuti qualcuno.