Autoriser la requête REST CORS à une application Express / Node.js sur Heroku

J’ai écrit une API REST sur le framework express pour node.js qui fonctionne pour les requêtes de la console js dans Chrome, et de la barre d’URL, etc. domain (CORS).

La première demande, faite automatiquement par le front-end javascript, concerne / api / search? Uri = et semble échouer sur la requête OPTIONS “preflight”.

Dans mon application express, j’ajoute des en-têtes CORS, en utilisant:

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(); } }; 

et:

 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 })); }); 

De la console Chrome, je reçois ces en-têtes:

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

Méthode de requête: OPTIONS

Code de statut: 200 OK

En-têtes de demande

 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 

Paramètres de chaîne de requête

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

En-têtes de réponse

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

Est-ce que cela ressemble à un manque d’en-têtes appropriés envoyés par l’application API?

Merci.

J’ai suivi votre code sur une application ExpressJS propre et cela fonctionne très bien.

Essayez de déplacer votre app.use(allowCrossDomain) en haut de la fonction configure.

pour prendre en charge les cookies avecCredentials, vous avez besoin de cette ligne xhr.withCredentials = true;

mdn docs xhr.withCredentials

Dans le serveur Express, ajoutez ce bloc avant tous les autres

 `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(); });` 

Cela ne pouvait pas être le cas pour la plupart des gens parcourant cette question mais j’avais exactement le même problème et la solution n’était pas liée à CORS .

La ssortingng secrète de jeton Web JSON n’est pas définie dans les variables d’environnement, de sorte que le jeton n’a pas pu être signé. Cela a causé une requête POST qui repose sur la vérification ou la signature d’un jeton pour obtenir un délai d’expiration et renvoyer une erreur 503 , indiquant au navigateur que quelque chose ne va pas dans CORS , ce qui n’est pas le cas. L’ajout de la variable d’environnement dans Heroku a résolu le problème.

J’espère que ça aidera quelqu’un.