101 votes

Autoriser les requêtes REST CORS vers 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 provenant de la console js dans Chrome, de la barre d'URL, etc. J'essaie maintenant de la faire fonctionner pour les demandes provenant d'une autre application, sur un domaine différent (CORS).

La première demande, effectuée automatiquement par le frontal javascript, est destinée à /api/search?uri=, et semble échouer sur la demande 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 }));
});

Depuis la console Chrome, j'obtiens 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 demande : OPTIONS

Code d'état : 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 la 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

Cela ressemble-t-il à un manque d'en-têtes appropriés envoyés par l'application API ?

Merci.

0 votes

J'obtiens cette erreur dans un code que je n'ai pas écrit, mais je ne comprends pas l'utilité d'un gestionnaire pour la fonction OPTIONS méthode. Quelqu'un pourrait-il m'aider à comprendre pourquoi ne pas traiter uniquement la méthode POST au lieu de traiter les deux POST y OPTIONS méthode ?

0 votes

Vous pouvez également inclure PATCH si vous l'utilisez à la place de PUT pour mettre à jour une ressource

0voto

Kuda Points 35

L'erreur de Cors pourrait être une couverture pour votre erreur réelle. Regardez dans les logs de votre build Heroku pour voir votre erreur réelle potentielle. La mienne était la suivante.

Heroku Postgres : "psql : FATAL : pas d'entrée pg_hba.conf pour l'hôte".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X