Eu escrevi uma API REST na estrutura expressa para node.js que funciona para solicitações do console js no Chrome e barra de URL, etc. Agora estou tentando fazê-la funcionar para solicitações de outro aplicativo, em um domínio (CORS).
A primeira solicitação, feita automaticamente pelo front end javascript, é para / api / search? Uri = e parece estar falhando na solicitação de OPÇÕES de "comprovação".
Em meu aplicativo expresso, estou adicionando cabeçalhos CORS, usando:
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
// intercept OPTIONS method
if ('OPTIONS' == req.method) {
res.send(200);
}
else {
next();
}
};
e:
app.configure(function () {
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(allowCrossDomain);
app.use(express.static(path.join(application_root, "public")));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
No console do Chrome, obtenho estes cabeçalhos:
URL de solicitação: http: //furious-night-5419.herokuapp.com/api/search? Uri = http% 3A% 2F% 2Flocalhost% 3A5000% 2Fcollections% 2F1% 2Fdocuments% 2F1
Método de solicitação: OPÇÕES
Código de status: 200 OK
Solicitar cabeçalhos
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-annotator-auth-token, accept
Access-Control-Request-Method:GET
Connection:keep-alive
Host:furious-night-5419.herokuapp.com
Origin:http://localhost:5000
Referer:http://localhost:5000/collections/1/documents/1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5
Parâmetros de string de consulta
uri:http://localhost:5000/collections/1/documents/1
Cabeçalhos de resposta
Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
X-Powered-By:Express
Isso parece uma falta de cabeçalhos adequados enviados pelo aplicativo API?
Obrigado.
OPTIONS
método. Alguém poderia me ajudar a entender por que não lidar apenas com oPOST
método em vez de lidar com o métodoPOST
eOPTIONS
?PATCH
se você for usá-lo em vez dePUT
atualizar um recursoRespostas:
Verifiquei seu código em um aplicativo ExpressJS limpo e ele funciona perfeitamente.
Tente mover
app.use(allowCrossDomain)
para o topo da função de configuração.fonte
app.use(app.router);
Cheers!para suportar cookies com credenciais, você precisa desta linha
xhr.withCredentials = true;
mdn docs xhr.withCredentials
No Express Server adicione este bloco antes de todos os outros
fonte
Estou adicionando isso como uma resposta apenas porque a postagem original foi colocada como um comentário e, como tal, foi esquecido pelos meus sinceramente na primeira vez que li esta página.
Como @ConnorLeech aponta em seu comentário sobre a resposta aceita acima, há um pacote npm muito útil chamado, não surpreendentemente, cors . Seu uso é tão simples quanto
var cors = require('cors'); app.use(cors());
(novamente, baseado na resposta do Sr. Leech) e também pode ser aplicado de uma forma mais rígida e configurável, conforme descrito em seus documentos .Também pode valer a pena apontar que o comentário original a que me refiro foi feito em 2014. É 2019 agora e olhando para a página github do pacote npm, o repo foi atualizado recentemente, há nove dias.
fonte
Não poderia ser o caso para a maioria das pessoas navegando nesta questão, mas eu tive exatamente o mesmo problema e a solução não estava relacionada a
CORS
.Acontece que o segredo JSON Web Token
string
não foi definido nas variáveis de ambiente, portanto, o token não pôde ser assinado. Isso causava qualquerPOST
solicitação que dependa da verificação ou assinatura de um token para obter um tempo limite e retornar um503
erro, informando ao navegador que há algo erradoCORS
, e não está. Adicionar a variável de ambiente no Heroku resolveu o problema.Espero que isso ajude alguém.
fonte
app.use(cors());
.