J'essaie de prendre en charge CORS dans mon application Node.js qui utilise le cadre Web Express.js. J'ai lu une discussion de groupe Google sur la façon de gérer cela et lu quelques articles sur le fonctionnement de CORS. Tout d'abord, je l'ai fait (le code est écrit en syntaxe CoffeeScript):
app.options "*", (req, res) ->
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
# try: 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
# try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
Cela ne semble pas fonctionner. Il semble que mon navigateur (Chrome) n'envoie pas la demande OPTIONS initiale. Lorsque je viens de mettre à jour le bloc de la ressource, je dois soumettre une demande GET d'origine croisée à:
app.get "/somethingelse", (req, res) ->
# ...
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
Cela fonctionne (dans Chrome). Cela fonctionne également dans Safari.
J'ai lu ça ...
Dans un navigateur implémentant CORS, chaque demande GET ou POST d'origine croisée est précédée d'une demande OPTIONS qui vérifie si le GET ou le POST est OK.
Donc, ma principale question est, comment se fait-il que cela ne semble pas se produire dans mon cas? Pourquoi mon bloc app.options n'est-il pas appelé? Pourquoi dois-je définir les en-têtes dans mon bloc app.get principal?
la source
Réponses:
Pour répondre à votre question principale, la spécification CORS requiert uniquement l'appel OPTIONS pour précéder le POST ou GET si le POST ou GET contient un contenu ou des en-têtes non simples.
Les types de contenu qui nécessitent une demande de pré-vol CORS (l'appel OPTIONS) sont tout type de contenu, à l'exception des suivants :
application/x-www-form-urlencoded
multipart/form-data
text/plain
Tout autre type de contenu en dehors de ceux énumérés ci-dessus déclenchera une demande de pré-vol.
En ce qui concerne les en-têtes, tout en-tête de demande en dehors des éléments suivants déclenchera une demande avant le vol:
Accept
Accept-Language
Content-Language
Content-Type
DPR
Save-Data
Viewport-Width
Width
Tout autre en-tête de demande déclenchera la demande de pré-vol.
Vous pouvez donc ajouter un en-tête personnalisé tel que:
x-Trigger: CORS
et cela devrait déclencher la demande de pré-vol et frapper le bloc OPTIONS.Voir Référence de l'API Web MDN - Demandes de contrôle en amont CORS
la source
OPTIONS
blocs ne sont pas envoyés. Ce serait bien s'il avait la liste des acceptésHEADERS
, ou quicontent-types
exigentOPTIONS
, etc. mais c'est un bon débutJ'ai trouvé la façon la plus simple est d'utiliser le package Node.js CORS . L'utilisation la plus simple est:
Il existe bien sûr de nombreuses façons de configurer le comportement selon vos besoins; la page liée ci-dessus montre un certain nombre d'exemples.
la source
cors({credentials: true, origin: true})
Essayez de passer le contrôle à la prochaine route correspondante. Si Express correspond d'abord à la route app.get, il ne continuera pas sur la route des options à moins que vous ne le fassiez (notez l'utilisation de la suivante) :
En termes d'organisation des trucs CORS, je l'ai mis dans un middleware qui fonctionne bien pour moi:
la source
config.allowedDomains
une chaîne délimitée par des virgules ou un tableau?Pour rester dans la même idée de routage. J'utilise ce code:
Similaire à l' exemple http://enable-cors.org/server_expressjs.html
la source
faire
et ajoutez simplement ces lignes dans votre fichier principal où va votre demande (conservez-la avant tout itinéraire).
la source
app.options('*', cors())
// inclure avant les autres itinérairesJ'ai réalisé un middleware plus complet adapté à l'express ou à la connexion. Il prend en charge les
OPTIONS
demandes de contrôle en amont. Notez qu'il permettra à CORS d'accéder à tout, vous voudrez peut-être faire quelques vérifications si vous voulez limiter l'accès.la source
installer le module cors d'expressjs. vous pouvez suivre ces étapes>
Installation
Utilisation simple (activer toutes les demandes CORS)
pour plus de détails, rendez-vous sur https://github.com/expressjs/cors
la source
TypeError: Cannot read property 'headers' of undefined
La configuration d'application la plus basique.Faites quelque chose comme ça:
la source
Test effectué avec express + node + ionic fonctionnant dans différents ports.
Localhost:8100
Localhost:5000
la source
installez simplement des cors dans votre projet. Prenez le terminal (invite de commande) et
cd
votre répertoire de projet et exécutez la commande ci-dessous:Prenez ensuite le fichier server.js et modifiez le code pour y ajouter les éléments suivants:
Cela a fonctionné pour moi ..
la source
cors
si vous faites lesres.header
choses.cors
est une bibliothèque qui gère tout cela pour vous. Supprimez vos première et troisième lignes (AKA tout aveccors
) et vous constaterez que cela fonctionne toujours.res.header("Access-Control-Allow-Origin", "*");
Cela fonctionne pour moi, car c'est une implémentation facile à l'intérieur des routes, j'utilise meanjs et son bon fonctionnement, safari, chrome, etc.
la source
Il y a quelque temps, j'ai rencontré ce problème, j'ai donc fait cela pour autoriser CORS dans mon application nodejs:
Vous devez d'abord installer
cors
en utilisant la commande ci-dessous:Ajoutez maintenant le code suivant au fichier de démarrage de votre application comme (
app.js or server.js
)la source
Dans mon
index.js
j'ai ajouté:la source
Access-Control-Allow-Origin = *
signifie que vous ne pourrez pas envoyer de cookies au serveur, ils seront rejetés par la politique CORS - source: developer.mozilla.org/en-US/docs/Web/HTTP/… . Donc, ne l'utilisez pas si vous souhaitez utiliser des cookies.Si vous souhaitez le rendre spécifique au contrôleur, vous pouvez utiliser:
Veuillez noter que cela autorisera également les iframes.
la source
Peut se référer au code ci-dessous pour la même chose. Source: Academind / node-restful-api
la source
const app = express();
et ça marche! Je pense qu'il est important de le mentionner.Ma solution la plus simple avec Express 4.2.0 (EDIT: ne semble pas fonctionner dans 4.3.0) était:
Je suppose que ça
app.all('/result', ...)
marcherait aussi ...la source
La réponse la plus simple est d'utiliser simplement le package cors .
Cela permettra à CORS dans tous les domaines. Si vous voulez apprendre à activer CORS sans modules externes , tout ce dont vous avez vraiment besoin est un middleware Express qui définit l'en -tête «Access-Control-Allow-Origin» . C'est le minimum dont vous avez besoin pour autoriser les domaines de demande croisée d'un navigateur à votre serveur.
la source
L'utilisation d'Express Middleware me convient parfaitement. Si vous utilisez déjà Express, ajoutez simplement les règles de middleware suivantes. Il devrait commencer à fonctionner.
Référence
la source
Ci-dessous a fonctionné pour moi, j'espère que cela aide quelqu'un!
Obtenu une référence de https://expressjs.com/en/resources/middleware/cors.html#configuring-cors
la source
J'ai trouvé qu'il était extrêmement facile de le faire avec le package de demande npm ( https://www.npmjs.com/package/request )
Ensuite, j'ai basé ma solution sur ce post http://blog.javascripting.com/2015/01/17/dont-hassle-with-cors/
la source
En dactylographie, si vous souhaitez utiliser le package node.js cors
Si vous ne souhaitez pas utiliser de bibliothèques tierces pour la gestion des erreurs cors, vous devez modifier la méthode handleCORSErrors ().
Pour utiliser le fichier app.ts
la source
Ceci est similaire à la réponse de Pat avec la différence que je termine avec res.sendStatus (200); au lieu de next ();
Le code interceptera toutes les requêtes du type de méthode OPTIONS et renverra les en-têtes de contrôle d'accès.
Le code accepte CORS de toutes origines comme demandé dans la question. Cependant, il serait préférable de remplacer le * par une origine spécifique, par exemple http: // localhost: 8080 pour éviter les abus.
Puisque nous utilisons la méthode app.options au lieu de la méthode app.use, nous n'avons pas besoin de faire cette vérification:
que nous pouvons voir dans certaines des autres réponses.
J'ai trouvé la réponse ici: http://johnzhang.io/options-request-in-express .
la source
Vous pouvez utiliser le middleware Express, bloquer votre domaine et vos méthodes.
la source
Nous pouvons éviter CORS et transmettre les demandes à l'autre serveur à la place:
la source
J'ai utilisé les étapes suivantes pour mon application Web et j'ai réussi:
Ajoutez le package cors à l'express:
Ajoutez les lignes suivantes après la configuration bodyParser . J'ai eu quelques problèmes à ajouter avant bodyParser:
la source
L'approche la plus simple consiste à installer le module cors dans votre projet en utilisant:
Ensuite, dans votre fichier serveur, importez-le en utilisant ce qui suit:
Ensuite, utilisez-le simplement comme un middleware comme celui-ci:
J'espère que cela t'aides!
la source
Si j'étais vous @OP, je changerais mon paradigme de programmation.
en supposant que vous obtenez ces CORS bloqués parce que vous faites des demandes à localhost ou quelque chose de similaire.
Finalement, si vous allez déployer des optoins de production comme
Google Cloud Platform
ouHeroku
ou, vous n'aurez pas à vous soucier de CORS comme autoriser l'origine ou quoi que ce soit lorsqu'il est en production.Ainsi, lors du test du serveur, utilisez simplement
postman
et vous ne bloquerez pas CORS, après cela, déployez votre serveur et travaillez sur votre client.la source
/ * tout d'abord, et cela pourrait être le problème parmi les développeurs juniors, comme moi: assurez-vous d'utiliser "lambda" >>>> "` "et non" '"dans votre méthode de récupération ! * /
`` `réponse const = attendre fetch (
https://api....
);/ plus, l'article suivant est fortement recommandé: https://developer.edamam.com/api/faq /
la source
simple est difficile:
la source
Essayez ceci dans votre fichier js principal:
Cela devrait résoudre votre problème
la source