web-dev-qa-db-fra.com

Autoriser CORS pour PUT dans Node.js

J'essaie d'appeler PUT à mon point de terminaison api de repos et j'obtiens cette erreur:

Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

J'ai activé CORS en utilisant cette solution: enable-cors , cela fonctionne pour POST.

Comment puis-je obtenir la même chose pour PUT?

Merci.

12
Akshay Khot

ajoute ça:

res.header ('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');

app.use(function(req, res, next) {
       res.header("Access-Control-Allow-Origin", "*");
       res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
       res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
          next();
    });
25
Julien

Vous devrez prendre en charge la méthode OPTIONS sur votre serveur car le navigateur pré-volera toutes les demandes PUT cross-origine, quels que soient les en-têtes que vous avez. Et, vous devez vous assurer que vous autorisez explicitement PUT dans vos en-têtes CORS. Voir ceci depuis la page de MDN sur CORS :

De plus, pour les méthodes de requête HTTP qui peuvent provoquer des effets secondaires sur les données du serveur (en particulier, pour les méthodes HTTP autres que GET, ou pour POST avec certains types MIME), la spécification exige que les navigateurs "contrôle en amont" la demande, en sollicitant les méthodes prises en charge auprès du serveur avec une méthode de demande HTTP OPTIONS, puis, sur "approbation" du serveur, en envoyant la demande réelle avec la méthode de demande HTTP réelle. Les serveurs peuvent également informer les clients si des "informations d'identification" (y compris les cookies et les données d'authentification HTTP) doivent être envoyés avec les demandes.

Donc, sur votre serveur, vous devez faire quelque chose comme ceci:

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

Voici un article sur le sujet:

Demandes d'origine croisée dans Express.JS

9
jfriend00