Erro de CORS: O que é e como resolver?

Olá, hoje iremos abordar uma problema muito comum que ocorre quando se faz uma requisição seja ela usando o FetchAPI e ou XMLHttpRequest o erro de CORS. Mas primeiramente precisamos entender o que é isso.
O Cross-Origin Resource Sharing ou CORS é um mecanismo do navegador utilizado para disparar quando se tenta fazer uma solicitação de origem cruzada.

Erro cors

Então quando uma requisição é feita para o domínio diferente na qual ela está originalmente(ex: localhost => joke-api)o navegador bloqueia essa requisição por motivos de segurança a não ser que o servidor de destino permita.

Existem alguns cabeçalhos que podemos utilizar quando configuramos o lado do servidor para não termos esse erro de CORS. Ao enviar uma requisição de origem cruzada o servidor precisa enviar na resposta do cabeçalho Access-Control-Allow-Origin. Abaixo deixo dois exemplos de como o servidor pode enviar a resposta. O asterisco(*) significa que é permitido requisições de qualquer origem.

Access-Control-Allow-Origin: http://localhost:3000/
Access-Control-Allow-Origin: *

Abaixo irei listar alguns cabeçalhos referente ao CORS:

  • Access-Control-Allow-Origin
    Especifica quais domínios podem acessar os recursos do servidor.
  • Access-Control-Allow-Methods
    Indica quais métodos HTTP são permitidos (GET, POST, PUT, DELETE, etc.).
  • Access-Control-Allow-Headers
    Lista os cabeçalhos que podem ser usados durante a requisição.
  • Access-Control-Allow-Credentials
    Define se a requisição pode incluir cookies ou outras credenciais como token.

Então quando você ver que o servidor não inseriu nenhum desses cabeçalhos sabia que o navegador pode bloquear a requisição.

Para corrigir o erro do CORS deve-se ajustar o servidor para adicionar o cabeçalho Access-Control-Allow-Origin de forma adequada, permitindo o domínio da origem da requisição. Caso você não tenha acesso ao servidor configurar um proxy no mesmo domínio da requisição pode ser uma solução:

fetch('http://localhost:3000/proxy/https://api.ex.com/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('CORS error:', error));

Um ponto a se observar é que todos os navegadores mais modernos são compatíveis com o CORS, então ao usar um navegador mais antigo verifique a sua compatibilidade. A configuração do CORS é um pouco complicada para aqueles que não possuem conhecimento profundo, mas serve de treinamento e aprendizado para aqueles que possuem curiosidade de como se faz.

Dê uma olhada também:
Cross-Origin Resource Sharing (CORS) – HTTP | MDN (mozilla.org)

Como fazer um POST request a uma API usando Javascript – FrontMaster