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?