ReactJS: após adicionar o plug-in Chrome CORS, falha na busca de rejeição não tratada (TypeError)

Temp mail SuperHeros
ReactJS: após adicionar o plug-in Chrome CORS, falha na busca de rejeição não tratada (TypeError)
ReactJS: após adicionar o plug-in Chrome CORS, falha na busca de rejeição não tratada (TypeError)

Lidando com erros de API no React: desafios do plug-in CORS

Ao trabalhar com APIs em React JS, os desenvolvedores frequentemente encontram vários desafios relacionados à busca de dados, especialmente ao lidar com APIs de terceiros. Um problema comum que surge é o erro “Rejeição não tratada (TypeError): Falha ao buscar”. Esse erro pode ocorrer mesmo ao usar APIs populares como a API de lista de restaurantes do Swiggy, que muitos desenvolvedores usam para aprimorar seus aplicativos da web.

Nesse caso, adicionar uma extensão CORS do Chrome pode parecer uma solução viável para contornar políticas restritivas do navegador. No entanto, pode introduzir novas complicações em vez de resolver o problema. Se você estiver usando um plug-in CORS em seu ambiente de desenvolvimento e suas solicitações de API falharem logo após o carregamento, você poderá estar enfrentando um problema em que o plug-in entra em conflito com o comportamento de tratamento de solicitações do navegador.

Noções básicas sobre como gerenciar solicitações de origem cruzada e solucionar problemas Erros de CORS no ReactJS é essencial para um processo de desenvolvimento tranquilo. APIs como a do Swiggy geralmente possuem camadas de segurança, como o CORS, para controlar o acesso de clientes não autorizados. Essas restrições podem levar a erros que precisam ser resolvidos adequadamente.

Neste guia, exploraremos por que esse erro ocorre, principalmente após adicionar um plugin CORS no Chrome. Também discutiremos estratégias para resolvê-lo ao trabalhar com a API Swiggy em seu Reagir aplicações.

Comando Exemplo de uso
fetch() Este comando é usado para fazer solicitações HTTP para a API Swiggy. Ele busca recursos de forma assíncrona e retorna uma promessa, que resolve para um objeto Response. É fundamental para recuperar dados de restaurantes da API.
useEffect() Usado no React, este gancho permite a execução de efeitos colaterais como chamadas de API após renderizar o componente. Ele garante que a solicitação de busca para a API do Swiggy seja feita assim que o componente for montado.
res.setHeader() Este comando Express define cabeçalhos HTTP personalizados, como Acesso-Controle-Permitir-Origem, o que é crucial no tratamento do CORS. Ele permite que o backend permita solicitações de qualquer origem, evitando erros de CORS.
res.json() Este método é usado para enviar uma resposta JSON de volta ao cliente. Na solução de servidor proxy, ele garante que os dados da API obtidos do Swiggy sejam retornados no formato JSON, que o front-end pode consumir facilmente.
await Esta palavra-chave pausa a execução da função assíncrona até que a operação de busca seja resolvida, garantindo que o código aguarde os dados da API antes de prosseguir, evitando rejeições não tratadas.
express() O expressar() função é usada para criar uma instância de um servidor Express. Este servidor atua como um proxy entre o frontend e a API Swiggy para evitar problemas de CORS durante a busca de dados.
app.listen() Este comando faz com que o servidor Express comece a escutar solicitações recebidas em uma porta especificada (por exemplo, porta 5000 neste caso). É crucial hospedar o servidor proxy localmente durante o desenvolvimento.
try...catch Este bloco trata de erros que podem ocorrer durante a solicitação de busca, como falhas de rede ou problemas com a API Swiggy. Ele garante que o aplicativo lide normalmente com os erros, em vez de travar.

Explicando soluções para problemas de CORS em React com API Swiggy

Na primeira solução, criamos um Node.js back-end usando Express para contornar o problema de CORS ao buscar os dados do restaurante da API do Swiggy. A política CORS impede que os navegadores façam solicitações para um domínio diferente, a menos que esse domínio permita. Ao criar um servidor simples, podemos atuar como uma camada intermediária entre o cliente e a API, buscando os dados do lado do servidor e retornando-os ao front-end do React. Este método evita erros de CORS, pois a solicitação vem da mesma origem do aplicativo cliente.

O back-end Express configura cabeçalhos personalizados, especialmente o Acesso-Controle-Permitir-Origem, o que permite ao nosso cliente solicitar os recursos sem enfrentar restrições de CORS. A chamada de busca para a API do Swiggy é feita no lado do servidor e os dados são retornados no formato JSON. Essa abordagem costuma ser considerada mais segura e de melhor desempenho em ambientes de produção, pois oculta chaves de API ou informações confidenciais. Além disso, o uso de try-catch garante o tratamento adequado de erros, exibindo mensagens de erro fáceis de usar caso a API não responda.

Na segunda solução, modificamos a solicitação de busca no código React do lado do cliente. Este método envolve adicionar cabeçalhos personalizados na chamada de busca, garantindo que a solicitação seja formatada corretamente antes de chegar à API. Usamos React useEfeito gancho para acionar a chamada da API quando o componente for montado. A função assíncrona aguarda a resposta da API, converte-a em JSON e trata de erros se a solicitação falhar. No entanto, esta solução ainda enfrenta problemas de CORS se a API não permitir solicitações de origem cruzada diretamente dos navegadores.

Por fim, na terceira solução, utilizamos um serviço de terceiros chamado CORS-Anywhere. Este é um serviço de middleware que ajuda temporariamente a contornar as restrições do CORS, redirecionando a solicitação da API por meio do servidor. Embora esta solução possa funcionar em ambientes de desenvolvimento, não é recomendada para produção devido a riscos de segurança e à dependência de serviços externos. Ele também introduz sobrecarga de desempenho, pois adiciona uma camada adicional ao processo de busca de dados. Usar este método pode ser conveniente durante as fases de teste, mas deve ser evitado na produção por razões de segurança.

Solução 1: Lidando com problemas de CORS com servidor proxy

Esta solução usa um servidor proxy backend Node.js para evitar erros de CORS e buscar dados corretamente da API Swiggy.

const express = require('express');
const fetch = require('node-fetch');
const app = express();
const port = 5000;

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET');
  next();
});

app.get('/restaurants', async (req, res) => {
  try {
    const response = await fetch('https://www.swiggy.com/dapi/restaurants/list/v5?lat=23.1685786&lng=79.9338798');
    const data = await response.json();
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: 'Failed to fetch restaurants' });
  }
});

app.listen(port, () => {
  console.log(`Server running on http://localhost:${port}`);
});

Solução 2: usando busca de front-end com cabeçalhos personalizados e tratamento de erros

Essa abordagem modifica a solicitação de busca diretamente no React, adicionando cabeçalhos personalizados e tratando erros de maneira eficaz.

import React, { useEffect } from 'react';

const Body = () => {
  async function getRestaurants() {
    try {
      const response = await fetch(
        'https://www.swiggy.com/dapi/restaurants/list/v5?lat=23.1685786&lng=79.9338798',
        { headers: { 'Content-Type': 'application/json' } }
      );

      if (!response.ok) {
        throw new Error('Network response was not ok');
      }

      const data = await response.json();
      console.log(data);
    } catch (error) {
      console.error('Fetch error:', error);
    }
  }

  useEffect(() => {
    getRestaurants();
  }, []);
};

export default Body;

Solução 3: Usando Middleware CORS-Anywhere para Desenvolvimento

Este método usa o serviço "CORS-Anywhere" para ignorar as restrições do CORS durante o modo de desenvolvimento. Esta solução não deve ser usada na produção.

const Body = () => {
  async function getRestaurants() {
    try {
      const response = await fetch(
        'https://cors-anywhere.herokuapp.com/https://www.swiggy.com/dapi/restaurants/list/v5?lat=23.1685786&lng=79.9338798'
      );

      const data = await response.json();
      console.log(data);
    } catch (error) {
      console.error('Error fetching restaurants:', error);
    }
  }

  useEffect(() => {
    getRestaurants();
  }, []);
};

export default Body;

Solução de problemas de CORS em solicitações de API

Uma das razões subjacentes para o erro "Falha ao buscar" em um aplicativo React, especialmente ao usar APIs de terceiros como Swiggy, é CORS (Compartilhamento de recursos entre origens). CORS é um recurso de segurança que impede que aplicativos da web façam solicitações para um domínio diferente daquele a partir do qual foram atendidos. Nesse caso, a API Swiggy rejeita a solicitação porque ela se origina de um domínio diferente (seu aplicativo React). Isso é particularmente problemático quando você busca dados de APIs que não oferecem suporte explícito a solicitações de origem cruzada.

Uma solução alternativa comum é usar extensões de navegador como a extensão "Permitir CORS" do Chrome. No entanto, tais extensões podem levar a resultados inconsistentes. Isso ocorre porque eles manipulam configurações no nível do navegador que nem sempre sincronizam corretamente com as solicitações de API. Idealmente, esses plug-ins devem ser usados ​​apenas para desenvolvimento e não em ambientes de produção. Para produção, uma abordagem mais segura e confiável seria usar um servidor proxy backend que solicita os dados em nome do seu aplicativo React, conforme visto nas soluções fornecidas anteriormente.

Outro aspecto a considerar é lidar com erros de forma eficaz. Embora os problemas de CORS sejam uma causa comum de erros de “Falha ao buscar”, outros fatores como instabilidade da rede, URLs de API incorretos ou tempo de inatividade do servidor também podem resultar nesse erro. Portanto, é importante implementar tratamento robusto de erros no seu código, especialmente ao trabalhar com APIs de terceiros. Um mecanismo adequado de tratamento de erros ajudará a depurar o problema de forma mais eficaz e fornecerá mensagens fáceis de usar quando algo der errado.

Perguntas comuns sobre solicitações de CORS e API no React

  1. O que é CORS e por que é importante?
  2. CORS (Cross-Origin Resource Sharing) é uma política de segurança aplicada pelos navegadores para evitar solicitações maliciosas de domínios não confiáveis. Ele garante que apenas determinados domínios tenham permissão para buscar recursos de um servidor.
  3. Por que estou recebendo "Rejeição não tratada (TypeError): Falha ao buscar"?
  4. Este erro normalmente ocorre quando sua solicitação de API é bloqueada devido a restrições de CORS. Também pode ser causado por URLs de API incorretos ou problemas com o servidor.
  5. O que o useEffect gancho faz neste contexto?
  6. O useEffect hook no React é usado para acionar uma solicitação de API após a montagem do componente. Garante que a operação de busca ocorra no momento certo, evitando diversas solicitações desnecessárias.
  7. Como posso corrigir erros de CORS em um aplicativo React?
  8. Para corrigir erros de CORS, você pode usar um proxy de back-end, definir cabeçalhos adequados com res.setHeader no servidor ou conte com serviços como CORS-Anywhere para fins de desenvolvimento.
  9. Posso usar extensões de navegador CORS em produção?
  10. Não, as extensões do navegador CORS devem ser usadas apenas para desenvolvimento. Na produção, é mais seguro configurar o CORS no servidor ou usar um servidor proxy.

Considerações finais sobre como gerenciar erros CORS no React

Erros de CORS são um desafio comum ao desenvolver aplicativos React que consomem APIs de terceiros. Embora as extensões de navegador possam ajudar no desenvolvimento, é fundamental implementar soluções mais confiáveis, como um servidor proxy, em ambientes de produção para manter a segurança e a integridade dos dados.

Ao usar as técnicas corretas, como tratamento de erros e soluções de back-end, os desenvolvedores podem lidar com eficiência com problemas como “Falha ao buscar”. Isso garante que seu aplicativo forneça uma experiência de usuário tranquila ao interagir com APIs, melhorando o desempenho e a funcionalidade.

Referências e material de origem para compreender os problemas do CORS no React
  1. Para obter informações detalhadas sobre o Cross-Origin Resource Sharing (CORS) e como gerenciá-lo no React, consulte Documentos da Web MDN sobre CORS .
  2. Para entender mais sobre erros comuns do React, como "Falha ao buscar" e possíveis soluções, verifique Documentação do React sobre limites de erro .
  3. Se você estiver trabalhando com o Express para configurar um servidor proxy para contornar problemas de CORS, visite Roteamento e middleware Express.js .
  4. Para obter ajuda sobre como trabalhar com a API Fetch em JavaScript, consulte Documentos da Web MDN na API Fetch .
  5. Explore como usar a API do Swiggy para dados de restaurantes na documentação oficial da API: API Swiggy .