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?
fonte
Respostas:
Para responder à sua pergunta principal, a especificação CORS exige apenas que a chamada OPTIONS preceda o POST ou GET se o POST ou GET tiver conteúdo ou cabeçalhos não simples.
Os tipos de conteúdo que exigem uma solicitação de pré-vôo do CORS (a chamada OPTIONS) são qualquer tipo de conteúdo, exceto o seguinte :
application/x-www-form-urlencoded
multipart/form-data
text/plain
Quaisquer outros tipos de conteúdo, além dos listados acima, acionarão uma solicitação antes do voo.
Quanto aos cabeçalhos, todos os cabeçalhos de solicitação, exceto os seguintes , acionarão uma solicitação antes do voo:
Accept
Accept-Language
Content-Language
Content-Type
DPR
Save-Data
Viewport-Width
Width
Quaisquer outros cabeçalhos de solicitação acionarão a solicitação antes do voo.
Portanto, você pode adicionar um cabeçalho personalizado, como:,
x-Trigger: CORS
e que deve disparar a solicitação antes do voo e pressionar o bloco OPTIONS.Consulte Referência da API da Web MDN - Solicitações verificadas do CORS
fonte
OPTIONS
blocos não são enviados. Seria bom se ele tinha a lista de aceitosHEADERS
, ou quecontent-types
exigemOPTIONS
, etc, mas é um bom começoEu encontrei a maneira mais fácil é usar o pacote Node.js coros . O uso mais simples é:
Existem, é claro, muitas maneiras de configurar o comportamento de acordo com suas necessidades; a página vinculada acima mostra vários exemplos.
fonte
cors({credentials: true, origin: true})
Tente passar o controle para a próxima rota correspondente. Se o Express corresponder à rota app.get primeiro, ele não continuará na rota de opções, a menos que você faça isso (observe o uso da próxima) :
Em termos de organização do material do CORS, coloquei-o em um middleware que está funcionando bem para mim:
fonte
config.allowedDomains
uma cadeia de caracteres delimitada por vírgula ou uma matriz?Para permanecer na mesma idéia de roteamento. Eu uso este código:
Semelhante ao http://enable-cors.org/server_expressjs.html exemplo
fonte
Faz
e basta adicionar essas linhas no arquivo principal para onde a solicitação está indo (mantenha-a antes de qualquer rota).
fonte
app.options('*', cors())
// inclui antes de outras rotasEu criei um middleware mais completo, adequado para expressar ou conectar. Ele suporta
OPTIONS
solicitações para verificação de comprovação. Observe que isso permitirá que o CORS acesse qualquer coisa. Você pode fazer algumas verificações se quiser limitar o acesso.fonte
instale o módulo cors do expressjs. você pode seguir estas etapas>
Instalação
Uso simples (ativar todas as solicitações do CORS)
para obter mais detalhes, acesse https://github.com/expressjs/cors
fonte
TypeError: Cannot read property 'headers' of undefined
A configuração mais básica do aplicativo.Faça algo parecido com isto:
fonte
Testes realizados com express + node + ionic rodando em portas diferentes.
Localhost:8100
Localhost:5000
fonte
primeiro basta instalar cors no seu projeto. Leve o terminal (prompt de comando)
cd
para o diretório do projeto e execute o comando abaixo:Em seguida, pegue o arquivo server.js e altere o código para adicionar o seguinte:
Isso funcionou para mim ..
fonte
cors
se estiver fazendo asres.header
coisas.cors
é uma biblioteca que lida com tudo isso para você. Exclua suas primeira e terceira linhas (AKA com tudocors
) e você descobrirá que ainda funciona.res.header("Access-Control-Allow-Origin", "*");
Isso funciona para mim, pois é uma implementação fácil dentro das rotas, estou usando meanjs e está funcionando bem, safari, chrome, etc.
fonte
Há algum tempo, eu enfrentei esse problema, então fiz isso para permitir o CORS no meu aplicativo nodejs:
Primeiro você precisa instalar
cors
usando o comando abaixo:Agora adicione o seguinte código ao arquivo inicial do aplicativo, como (
app.js or server.js
)fonte
No meu
index.js
eu adicionei:fonte
Access-Control-Allow-Origin = *
significa que você não poderá enviar cookies para o servidor; eles serão rejeitados pela política do CORS - fonte: developer.mozilla.org/en-US/docs/Web/HTTP/… . Portanto, não use isso se quiser usar cookies.Se você deseja torná-lo específico do controlador, pode usar:
Observe que isso também permitirá iframes.
fonte
Pode consultar o código abaixo para o mesmo. Fonte: Academind / node-restful-api
fonte
const app = express();
e funcionar! Eu acho importante mencionar isso.Minha solução mais simples com o Express 4.2.0 (EDIT: parece não funcionar no 4.3.0) foi:
Suponho que fazer
app.all('/result', ...)
funcionaria também ...fonte
A resposta mais fácil é usar apenas o pacote cors .
Isso permitirá o CORS de maneira geral. Se você deseja aprender como habilitar o CORS sem módulos externos , tudo o que você realmente precisa é de um middleware Express que defina o cabeçalho 'Access-Control-Allow-Origin' . Esse é o mínimo necessário para permitir domínios de solicitação cruzada de um navegador para o servidor.
fonte
Usar o Express Middleware funciona muito bem para mim. Se você já estiver usando o Express, basta adicionar as seguintes regras de middleware. Deve começar a funcionar.
Referência
fonte
Abaixo funcionou para mim, espero que ajude alguém!
Obtenha referência em https://expressjs.com/en/resources/middleware/cors.html#configuring-cors
fonte
Achei extremamente fácil fazer isso com o pacote de solicitação npm ( https://www.npmjs.com/package/request )
Em seguida, baseiei minha solução neste post http://blog.javascripting.com/2015/01/17/dont-hassle-with-cors/
fonte
À máquina, se você quiser usar o Node.js pacote coros
Se você não quiser usar bibliotecas de terceiros para o tratamento de erros de cors, precisará alterar o método handleCORSErrors ().
Para usar o arquivo app.ts
fonte
Isso é semelhante à resposta de Pat com a diferença que eu termino com res.sendStatus (200); em vez de next ();
O código captura todas as solicitações do tipo de método OPTIONS e envia de volta os cabeçalhos de controle de acesso.
O código aceita o CORS de todas as origens, conforme solicitado na pergunta. No entanto, seria melhor substituir o * por uma origem específica, por exemplo, http: // localhost: 8080 para evitar o uso indevido.
Como usamos o método app.options em vez do método app.use, não precisamos fazer esta verificação:
o que podemos ver em algumas das outras respostas.
Encontrei a resposta aqui: http://johnzhang.io/options-request-in-express .
fonte
Você pode usar o middleware Express, bloquear seu domínio e métodos.
fonte
Podemos evitar o CORS e encaminhar as solicitações para o outro servidor:
fonte
Usei as seguintes etapas para meu aplicativo da web e tive sucesso:
Adicione o pacote cors ao expresso:
Adicione as seguintes linhas após a configuração do bodyParser . Eu tive alguns problemas para adicionar antes do bodyParser:
fonte
A abordagem mais simples é instalar o módulo cors no seu projeto usando:
Em seguida, no arquivo do servidor, importe-o usando o seguinte:
Em seguida, basta usá-lo como um middleware como este:
Espero que isto ajude!
fonte
Se eu fosse você @OP, mudaria meu paradigma de programação.
supondo que você esteja bloqueando esses CORS porque você está solicitando localhost ou algo semelhante.
Eventualmente, se você for implantar em optoins de produção como
Google Cloud Platform
ouHeroku
ou, não precisará se preocupar com o CORS como permitir a origem ou o que quer que esteja durante a produção.portanto, ao testar o servidor, basta usar
postman
e você não bloqueará o CORS; depois disso, implante o servidor e trabalhe no cliente.fonte
/ * antes de tudo, e este pode ser o problema entre os desenvolvedores juniores, como eu: certifique-se de usar "lambda" >>>> "` `" e não "'" em sua busca método de ! * /
`` `const response = aguarde fetch (
https://api....
);/ plus, o seguinte artigo é altamente recomendado: https://developer.edamam.com/api/faq /
fonte
simples é difícil:
fonte
Tente isso no seu arquivo js principal:
Isso deve resolver seu problema
fonte