Estou tentando oferecer suporte ao CORS no meu aplicativo Node.js. que usa a estrutura da web Express.js. Li uma discussão em grupo do Google sobre como lidar com isso e li alguns artigos sobre como o CORS funciona. Primeiro, fiz isso (o código está escrito na sintaxe do 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'
# ...
Não parece funcionar. Parece que meu navegador (Chrome) não está enviando a solicitação OPTIONS inicial. Quando acabei de atualizar o bloco para o recurso, preciso enviar uma solicitação GET de origem cruzada para:
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 (no Chrome). Isso também funciona no Safari.
Eu li isso ...
Em um navegador que implementa o CORS, cada solicitação GET ou POST de origem cruzada é precedida por uma solicitação OPTIONS que verifica se GET ou POST está OK.
Então, minha pergunta principal é: como isso parece não acontecer no meu caso? Por que meu bloco app.options não é chamado? Por que preciso definir os cabeçalhos no meu bloco principal app.get?