Estoy tratando de admitir CORS en mi aplicación Node.js que usa el marco web Express.js. Leí una discusión grupal de Google sobre cómo manejar esto, y leí algunos artículos sobre cómo funciona CORS. Primero, hice esto (el código está escrito en sintaxis 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'
# ...
No parece funcionar. Parece que mi navegador (Chrome) no está enviando la solicitud de OPCIONES inicial. Cuando acabo de actualizar el bloque para el recurso, necesito enviar una solicitud GET de origen cruzado a:
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'
# ...
Funciona (en Chrome). Esto también funciona en Safari.
He leído que ...
En un navegador que implementa CORS, cada solicitud GET o POST de origen cruzado está precedida por una solicitud OPTIONS que verifica si GET o POST está OK.
Entonces mi pregunta principal es, ¿cómo es que esto no parece suceder en mi caso? ¿Por qué no se llama a mi bloque app.options? ¿Por qué necesito configurar los encabezados en mi bloque app.get principal?