Cómo hago para que mi app creada en React no sea bloqueada por Cors

Hola.
He creado con Node un pequeño backend que consume al api de búsqueda de Catálogo. Es decir esta Api: https://quest.myvtex.com/api/catalog_system/pub/products/search

cuando ejecuto el código funciona correctamente.

Lo que requiero es crear un catálogo a parte del sitio web, que muestre todos los productos de la tienda.
Para esto he creado una app con React que consume una ruta de express que se comunica con el back creado previamente. Sin embargo, recibo un bloqueo de Cors.

Ya intneté poner en el header el “Access-Control-Allow-Origin”: “*” pero sigue sin funcionar.

¿Podrían orientarme cual es la forma adecuada de consumir una appi mediante una app de Front-end externa?

Gracias.

Express:

const router = Router();
router.get('/categoria/:id', getCategory);
export default router;

Node:

let config = {
   header: {
     Accept: "application/json",
     "Content-Type": "application/json",
     "Access-Control-Allow-Origin": "*"
   },
 };

export const getCategory = async (req, res) => {
  try {
    // Recupera las variables enviadas desde el frontend
    const { idCate } = req.params;
    console.log(idCate)
    // Realiza una solicitud a la API externa utilizando Axios
    //const response = await axios.get(`https://quest.myvtex.com/api/catalog_system/pub/products/search?${idCate}`, config);
    const response = await axios.get(`https://quest.myvtex.com/api/catalog_system/pub/products/search?${idCate}`, config);
    // Envía la respuesta de la API externa al frontend
    console.log(config)
    res.json(response.data);

  } catch (error) {
    console.log(error)
  }
}

React (Front)

const config = {
 header: {
   Accept: "*/*",
   "Content-Type": "application/json",
 }    
} 

const params = {
  idCate: "fq=14&_from=1&_to=1"
}

function App() {

  const [prodcuts, setProdcuts] = useState([])

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await axios.get("http://localhost:3000/products/categoria/" + params.idCate, config);
        setProdcuts(response.data);
        console.log(response);
      } catch (error) {
        console.log(error);
      }
    };
  
    fetchData();
  }, []);

¡Hola @Antony !

¿Existe alguna razón para desarrollar el backend fuera de VTEX?

Si utiliza el Node builder en VTEX IO y construye este backend en la infraestructura de VTEX, no necesitará preocuparse por CORS. Esto se debe a que al comunicarse con este backend, tendrá dos opciones:

1 - Comunicación vía GraphQL, donde CORS no será un problema.
2 - Comunicación vía REST, donde CORS tampoco será un problema ya que puedes usar rutas relativas en el frontend. Las rutas expuestas por el backend se ejecutarán en la misma URL base que la tienda.

Si realmente desea hacer el backend fuera de VTEX como lo está haciendo ahora, vale la pena agregar también el encabezado Access-Control-Allow-Methods en la respuesta, junto con el Access-Control-Allow-Origin que ya agregó.

Access-Control-Allow-Methods: GET

¡Espero haber ayudado!

1 Like

Hola Bruno.

Gracias por responder.
Te comento. Estoy haciendo una especie de catálogo en Whatsapp. Es decir, el cliente se contacta por esta app y se le redirige a un catálogo donde escogería los productos que desea. Al final, cuando el cliente termina de escoger los productos y le da en “comprar”, la app enviaría un mensaje a nuestro agente de whatsapp con todos los productos que el cliente escogió para proseguir con la compra.

Para esto se necesita un frontend totalmente distinto, pero no se puede consumir apis de VTEX desde una app de front, por lo tanto, era necesario un backend.

La empresa no cuenta con VTEX IO, así que intentaré la segunda opción que me diste.

Muchas gracias.

Buenas tardes, Antony

¿Solucionaste este error? Estoy teniendo el mismo problema, construyendo una app con nodej.