Adicione suporte CORS à sua API Express + TypeScript
Tempo de leitura: 5 minutos
Imagine que você acabou de criar uma excelente API usando Node.js, Express e TypeScript. Você também criou um aplicativo da Web do lado do cliente e está pronto para acionar o aplicativo em seu navegador, colocá-lo para funcionar com seu servidor e, esperamos, compartilhá-lo com o mundo.
Você abre uma janela do navegador e vai até onde seu aplicativo está sendo executado e, em seguida, abre o console em suas ferramentas de desenvolvedor. Seu aplicativo faz sua primeira chamada de API para seu servidor... mas, em vez dos dados esperados para preencher seu aplicativo, você recebe um erro em seu console como este:
Nossa! Este erro é devido a restrições de Compartilhamento de recursos de origem cruzada (CORS). Embora isso possa ser frustrante, é uma situação comum para muitos desenvolvedores.
Mas, o que é o CORS? E como você pode contornar essa mensagem de erro e obter os dados do seu servidor para o seu aplicativo? Este tutorial mostrará como adicionar suporte de CORS à sua API Express e TypeScript para que você possa continuar avançando com seus projetos interessantes.
O que é o Compartilhamento de recursos de origem cruzada (CORS)?
O compartilhamento de recursos de origem cruzada (CORS) é um protocolo de segurança em navegadores modernos que permite ou restringe o compartilhamento de recursos entre diferentes origens, dependendo de qual origem iniciou a solicitação HTTP.
Uma origem descreve onde uma solicitação é iniciada. As origens têm duas partes necessárias (esquema e nome de host) e uma parte opcional (porta), como mostrado abaixo:
O navegador adiciona um cabeçalho de Origem a todas as solicitações que faz. Quando uma solicitação chega ao servidor, se a origem na solicitação for incluída na lista de origens que têm permissão para recuperar recursos desse servidor, ele adicionará um cabeçalho Access-Control-Allow-Origin
à sua resposta para informar ao navegador que o conteúdo está acessível a essa origem específica.
Por exemplo, o seguinte mostra que todas as origens têm permissão para solicitar recursos:
No entanto, o cabeçalho abaixo informa ao navegador que somente solicitações de https://www.twilio.com
são recursos permitidos:
É provável que você esteja usando portas diferentes durante seu trabalho de desenvolvimento local. Se você observar a mensagem de erro de exemplo da introdução desta postagem, poderá ver que, neste exemplo, o aplicativo está sendo veiculado em localhost:3000
, mas está tentando buscar dados de localhost:5000
. Como as duas portas são diferentes, isso significa que elas são de origens diferentes. Assim, por padrão, o navegador negará essa solicitação:
Para corrigir isso e permitir que os dados fluam entre o servidor e o cliente, você pode adicionar o suporte CORS ao servidor. Neste tutorial, você usara o pacote npm cors
para adicionar o middleware que definirá o cabeçalho Access-Control-Allow-Origin
e especificar os domínios que são permitidos para acessar os recursos de seu servidor.
Configure o CORS no seu servidor Express
Para começar, você precisará de:
- Node.js (versão 14.16.1 ou mais recente) e npm instalados na sua máquina.
- Um projeto Express, como a API de vídeo no branch getting-started deste repositório.
As informações do CORS neste tutorial podem ser usadas para qualquer projeto Express. No entanto, para os fins deste exemplo, você pode querer seguir o código no projeto Express listado acima. Esta API de vídeo é criada com Express e TypeScript, portanto, é um ótimo projeto de amostra com o qual trabalhar.
Se você estiver seguindo o projeto de amostra, siga as instruções no README.md do repositório para começar a trabalhar.
Depois de executar o comando npm run start
, você verá uma instrução de log no terminal que permite saber se o servidor está sendo executado na porta 5000:
Se, em vez disso, você estiver usando sua própria API Express, isso também é ótimo! Suas solicitações cURL provavelmente serão diferentes, então substitua os parâmetros que fazem sentido para o seu projeto.
Execute uma simulação com um comando cURL
Se você estiver usando o código de exemplo do repositório acima, abra uma segunda janela de terminal e tente executar o seguinte comando cURL:
Com esse comando cURL, você está simulando como o navegador emite uma solicitação. Neste caso, seu servidor está executando http://localhost:5000
e seu aplicativo está sendo executado e fazendo uma solicitação a partir da origem localhost:3000
. Neste exemplo, seu "aplicativo" está tentando solicitar uma lista de salas de bate-papo com vídeo.
A resposta exibida na janela do terminal será semelhante à resposta abaixo:
Se você examinar essa saída, perceberá que não há um cabeçalho Access-Control-Allow-Origin
nesta resposta. Se essa fosse realmente uma resposta recebida por um navegador, ele bloquearia a solicitação.
É hora de atualizar seu servidor para que ele responda com o cabeçalho Access-Control-Allow-Origin
para solicitações específicas de origem cruzada.
Adicione o pacote npm cors
ao seu projeto Express
Na janela do terminal, navegue até a raiz do projeto. Se você estiver acompanhando o código de exemplo, a raiz do projeto é o diretório express-video-api.
Instale o pacote cors
e seus tipos TypeScript executando os seguintes comandos:
Se você observar o arquivo package.json, você verá que o cors
foi adicionado como uma dependency
e @types/cors
foi adicionado a devDependencies
.
Configure as opções de CORS
Em seguida, abra o arquivo que é o ponto de entrada para seu aplicativo. Se você estiver seguindo com o código de exemplo, este arquivo é src/index.ts.
Em seu editor de código e abaixo da linha em que você importou express
, importe cors
também:
Adicione a seguinte linha acima de app.use(express.json());
para permitir que seu servidor Express use o middleware cors
:
Em seguida, adicione uma lista das origens que você deseja permitir acessar recursos em seu servidor e passe essa lista para suas opções de CORS. Neste tutorial, você adicionará localhost:3000
como a origem que você quer permitir:
Em seguida, passe estas opções como um argumento para seu middleware cors
:
Seu servidor Express notará as alterações e a atualização.
Neste ponto, se você estiver acompanhando o projeto de exemplo, seu código deverá ser parecido com o código abaixo:
Teste se o CORS está funcionando
Agora que você configurou as opções de CORS no servidor, tente executar a seguinte simulação de comando cURL no terminal novamente:
Se você verificar a resposta, perceberá que agora há um cabeçalho Access-Control-Allow-Origin
com a origem http:://localhost:3000
! Isso significa que, quando você executar seu aplicativo do lado do cliente localhost:3000
, o aplicativo conseguirá recuperar recursos de seu servidor.
Em um teste separado, tente executar o seguinte comando cURL também:
Observe que, neste comando, você alterou a origem em sua solicitação para http://localhost:4000
, que não estava na sua lista de origens permitidas. A resposta que retorna não tem o cabeçalho Access-Control-Allow-Origin
:
Isso significa que se alguém tentar acessar seu servidor a partir de um aplicativo em execução em localhost:4000
, não conseguirá acessar os recursos. Em vez disso, um erro CORS semelhante ao anterior aparecerá em seu console.
O que vem a seguir para seu projeto Express API?
Se quiser conferir todo o código de exemplo atualizado deste tutorial, você encontra esse código no branch added-cors deste repositório no GitHub. Ou, se você quiser apenas uma 'colinha' de como implementar o CORS em seu próprio aplicativo, confira o gist aqui.
Agora que sabe como adicionar o suporte CORS ao seu servidor Express e TypeScript, está tudo pronto para ligar o seu servidor a um aplicativo do lado do cliente. Que tipo de aplicativo você tem em mente? Estamos ansiosos para ver o que você vai criar.
Publicações relacionadas
Recursos relacionados
Twilio Docs
De APIs a SDKs e aplicativos de amostra
Documentação de referência de API, SDKs, bibliotecas auxiliares, guias de início rápido e tutoriais para sua linguagem e plataforma.
Centro de Recursos
Os mais recentes e-books, relatórios do setor e webinars
Aprenda com especialistas em engajamento do cliente para melhorar sua própria comunicação.
Ahoy
Centro da comunidade de desenvolvedores da Twilio
Melhores práticas, exemplos de código e inspiração para criar comunicações e experiências de engajamento digital.