ReactJS: Μετά την προσθήκη της προσθήκης Chrome CORS, η ανάκτηση της μη χειριζόμενης απόρριψης (TypeError) απέτυχε

Temp mail SuperHeros
ReactJS: Μετά την προσθήκη της προσθήκης Chrome CORS, η ανάκτηση της μη χειριζόμενης απόρριψης (TypeError) απέτυχε
ReactJS: Μετά την προσθήκη της προσθήκης Chrome CORS, η ανάκτηση της μη χειριζόμενης απόρριψης (TypeError) απέτυχε

Χειρισμός σφαλμάτων API στο React: CORS Plugin Challenges

Όταν εργάζεστε με API στο ReactJS, οι προγραμματιστές αντιμετωπίζουν συχνά διάφορες προκλήσεις που σχετίζονται με την ανάκτηση δεδομένων, ειδικά όταν ασχολούνται με API τρίτων. Ένα συνηθισμένο ζήτημα που προκύπτει είναι το σφάλμα "Μη χειριζόμενη απόρριψη (TypeError): Απέτυχε η ανάκτηση". Αυτό το σφάλμα μπορεί να προκύψει ακόμη και όταν χρησιμοποιείτε δημοφιλή API, όπως το API της λίστας εστιατορίων του Swiggy, το οποίο χρησιμοποιούν πολλοί προγραμματιστές για να βελτιώσουν τις εφαρμογές ιστού τους.

Σε αυτήν την περίπτωση, η προσθήκη μιας επέκτασης CORS Chrome μπορεί να φαίνεται ως μια βιώσιμη λύση για την παράκαμψη των περιοριστικών πολιτικών του προγράμματος περιήγησης. Ωστόσο, μπορεί να δημιουργήσει νέες επιπλοκές αντί να επιλύσει το πρόβλημα. Εάν χρησιμοποιείτε μια προσθήκη CORS στο περιβάλλον ανάπτυξής σας και τα αιτήματα API αποτυγχάνουν λίγο μετά τη φόρτωση, ενδέχεται να αντιμετωπίζετε πρόβλημα όπου η προσθήκη έρχεται σε διένεξη με τη συμπεριφορά χειρισμού αιτημάτων του προγράμματος περιήγησης.

Κατανόηση του τρόπου διαχείρισης αιτημάτων πολλαπλής προέλευσης και αντιμετώπισης προβλημάτων Σφάλματα CORS στο ReactJS είναι απαραίτητο για μια ομαλή διαδικασία ανάπτυξης. Τα API όπως του Swiggy έχουν συχνά επίπεδα ασφαλείας, όπως το CORS, για τον έλεγχο της πρόσβασης από μη εξουσιοδοτημένους πελάτες. Αυτοί οι περιορισμοί μπορεί να οδηγήσουν σε σφάλματα που πρέπει να αντιμετωπιστούν σωστά.

Σε αυτόν τον οδηγό, θα διερευνήσουμε γιατί παρουσιάζεται αυτό το σφάλμα, ιδιαίτερα μετά την προσθήκη μιας προσθήκης CORS στο Chrome. Θα συζητήσουμε επίσης στρατηγικές για την επίλυσή του ενώ εργάζεστε με το Swiggy API στο δικό σας Αντιδρώ εφαρμογές.

Εντολή Παράδειγμα χρήσης
fetch() Αυτή η εντολή χρησιμοποιείται για την υποβολή αιτημάτων HTTP στο Swiggy API. Παίρνει πόρους ασύγχρονα και επιστρέφει μια υπόσχεση, η οποία επιλύεται σε ένα αντικείμενο Response. Είναι το κλειδί για την ανάκτηση δεδομένων εστιατορίου από το API.
useEffect() Χρησιμοποιείται στο React, αυτό το άγκιστρο επιτρέπει την εκτέλεση παρενεργειών όπως κλήσεις API μετά την απόδοση του στοιχείου. Διασφαλίζει ότι το αίτημα ανάκτησης στο API του Swiggy πραγματοποιείται μόλις προσαρτηθεί το στοιχείο.
res.setHeader() Αυτή η εντολή Express ορίζει προσαρμοσμένες κεφαλίδες HTTP, όπως π.χ Access-Control-Allow-Origin, το οποίο είναι κρίσιμο για το χειρισμό CORS. Επιτρέπει στο backend να επιτρέπει αιτήματα από οποιαδήποτε προέλευση, αποτρέποντας σφάλματα CORS.
res.json() Αυτή η μέθοδος χρησιμοποιείται για την αποστολή μιας απάντησης JSON πίσω στον πελάτη. Στη λύση διακομιστή μεσολάβησης, διασφαλίζει ότι τα δεδομένα API που λαμβάνονται από το Swiggy επιστρέφονται σε μορφή JSON, την οποία η διεπαφή μπορεί εύκολα να καταναλώσει.
await Αυτή η λέξη-κλειδί διακόπτει την εκτέλεση της ασύγχρονης συνάρτησης έως ότου επιλυθεί η λειτουργία ανάκτησης, διασφαλίζοντας ότι ο κώδικας περιμένει για τα δεδομένα του API πριν προχωρήσει, αποτρέποντας τις μη χειριζόμενες απορρίψεις.
express() Ο εξπρές() Η συνάρτηση χρησιμοποιείται για τη δημιουργία μιας παρουσίας ενός διακομιστή Express. Αυτός ο διακομιστής λειτουργεί ως διακομιστής μεσολάβησης μεταξύ της διεπαφής και του Swiggy API για την αποφυγή προβλημάτων CORS κατά την ανάκτηση δεδομένων.
app.listen() Αυτή η εντολή κάνει τον διακομιστή Express να αρχίσει να ακούει για εισερχόμενα αιτήματα σε μια καθορισμένη θύρα (π.χ. θύρα 5000 σε αυτήν την περίπτωση). Είναι ζωτικής σημασίας για τη φιλοξενία του διακομιστή μεσολάβησης τοπικά κατά την ανάπτυξη.
try...catch Αυτό το μπλοκ χειρίζεται σφάλματα που μπορεί να προκύψουν κατά την αίτηση ανάκτησης, όπως αποτυχίες δικτύου ή ζητήματα με το Swiggy API. Διασφαλίζει ότι η εφαρμογή χειρίζεται με χάρη τα σφάλματα αντί να κολλάει.

Επεξήγηση λύσεων για ζητήματα CORS στο React με το Swiggy API

Στην πρώτη λύση, δημιουργήσαμε ένα Node.js backend χρησιμοποιώντας το Express για να παρακάμψει το ζήτημα CORS κατά την ανάκτηση των δεδομένων του εστιατορίου από το API του Swiggy. Η πολιτική CORS αποτρέπει τα προγράμματα περιήγησης από το να υποβάλλουν αιτήματα σε διαφορετικό τομέα, εκτός εάν ο συγκεκριμένος τομέας το επιτρέπει. Δημιουργώντας έναν απλό διακομιστή, μπορούμε να λειτουργήσουμε ως μεσαίο επίπεδο μεταξύ του πελάτη και του API, φέρνοντας τα δεδομένα από την πλευρά του διακομιστή και επιστρέφοντάς τα στο front-end του React. Αυτή η μέθοδος αποφεύγει τα σφάλματα CORS, καθώς το αίτημα προέρχεται από την ίδια προέλευση με την εφαρμογή πελάτη.

Το backend Express ρυθμίζει προσαρμοσμένες κεφαλίδες, ιδιαίτερα το Access-Control-Allow-Origin, που επιτρέπει στον πελάτη μας να ζητήσει τους πόρους χωρίς να αντιμετωπίζει περιορισμούς CORS. Η κλήση ανάκτησης στο API του Swiggy γίνεται από την πλευρά του διακομιστή και τα δεδομένα επιστρέφονται σε μορφή JSON. Αυτή η προσέγγιση θεωρείται συχνά πιο ασφαλής και αποδοτική σε περιβάλλοντα παραγωγής, καθώς κρύβει κλειδιά API ή ευαίσθητες πληροφορίες. Επιπλέον, η χρήση του try-catch διασφαλίζει τον σωστό χειρισμό σφαλμάτων, εμφανίζοντας φιλικά προς το χρήστη μηνύματα σφάλματος εάν το API δεν ανταποκριθεί.

Στη δεύτερη λύση, τροποποιούμε το αίτημα ανάκτησης στον κώδικα React από την πλευρά του πελάτη. Αυτή η μέθοδος περιλαμβάνει την προσθήκη προσαρμοσμένων κεφαλίδων στην κλήση ανάκτησης, διασφαλίζοντας ότι το αίτημα έχει μορφοποιηθεί σωστά πριν φτάσει στο API. Χρησιμοποιούμε το React useEffect συνδέστε για να ενεργοποιήσετε την κλήση API κατά την προσάρτηση του στοιχείου. Η συνάρτηση async περιμένει την απόκριση API, τη μετατρέπει σε JSON και χειρίζεται σφάλματα εάν το αίτημα αποτύχει. Ωστόσο, αυτή η λύση εξακολουθεί να αντιμετωπίζει ζητήματα CORS εάν το API δεν επιτρέπει αιτήματα πολλαπλής προέλευσης από προγράμματα περιήγησης απευθείας.

Τέλος, στην τρίτη λύση, χρησιμοποιούμε μια υπηρεσία τρίτων που ονομάζεται CORS-Anywhere. Αυτή είναι μια υπηρεσία ενδιάμεσου λογισμικού που βοηθά προσωρινά στην παράκαμψη των περιορισμών CORS, αναδρομολογώντας το αίτημα API μέσω του διακομιστή τους. Αν και αυτή η λύση μπορεί να λειτουργήσει σε περιβάλλοντα ανάπτυξης, δεν συνιστάται για παραγωγή λόγω κινδύνων ασφαλείας και εξάρτησης από εξωτερικές υπηρεσίες. Εισάγει επίσης επιβάρυνση απόδοσης καθώς προσθέτει ένα επιπλέον επίπεδο στη διαδικασία ανάκτησης δεδομένων. Η χρήση αυτής της μεθόδου μπορεί να είναι βολική κατά τη διάρκεια των φάσεων δοκιμής, αλλά θα πρέπει να αποφεύγεται στην παραγωγή για λόγους ασφαλείας.

Λύση 1: Χειρισμός ζητημάτων CORS με διακομιστή μεσολάβησης

Αυτή η λύση χρησιμοποιεί έναν διακομιστή μεσολάβησης υποστήριξης Node.js για την αποφυγή σφαλμάτων CORS και τη σωστή ανάκτηση δεδομένων από το Swiggy API.

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}`);
});

Λύση 2: Χρήση Πρόσβασης στο Front-End με προσαρμοσμένες κεφαλίδες και διαχείριση σφαλμάτων

Αυτή η προσέγγιση τροποποιεί το αίτημα ανάκτησης απευθείας στο React, προσθέτοντας προσαρμοσμένες κεφαλίδες και αντιμετωπίζοντας αποτελεσματικά τα σφάλματα.

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;

Λύση 3: Χρήση του ενδιάμεσου λογισμικού CORS-Anywhere για ανάπτυξη

Αυτή η μέθοδος χρησιμοποιεί την υπηρεσία "CORS-Anywhere" για να παρακάμψει τους περιορισμούς CORS κατά τη λειτουργία ανάπτυξης. Αυτό το διάλυμα δεν πρέπει να χρησιμοποιείται στην παραγωγή.

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;

Αντιμετώπιση προβλημάτων CORS σε αιτήματα API

Ένας από τους βασικούς λόγους για το σφάλμα "Αποτυχία λήψης" σε μια εφαρμογή React, ειδικά όταν χρησιμοποιούνται API τρίτων κατασκευαστών όπως το Swiggy, είναι ΚΟΡΣ περιορισμοί (Κοινή χρήση πόρων μεταξύ προέλευσης). Το CORS είναι μια δυνατότητα ασφαλείας που περιορίζει τις εφαρμογές Ιστού από το να υποβάλλουν αιτήματα σε διαφορετικό τομέα από αυτόν από τον οποίο εξυπηρετήθηκαν. Σε αυτήν την περίπτωση, το Swiggy API απορρίπτει το αίτημα επειδή προέρχεται από διαφορετικό τομέα (την εφαρμογή React σας). Αυτό είναι ιδιαίτερα προβληματικό όταν λαμβάνετε δεδομένα από API που δεν υποστηρίζουν ρητά αιτήματα πολλαπλής προέλευσης.

Μια συνηθισμένη λύση είναι η χρήση επεκτάσεων προγράμματος περιήγησης όπως η επέκταση Chrome "Allow CORS". Ωστόσο, τέτοιες επεκτάσεις μπορεί να οδηγήσουν σε ασυνεπή αποτελέσματα. Αυτό συμβαίνει επειδή χειρίζονται ρυθμίσεις σε επίπεδο προγράμματος περιήγησης που δεν συγχρονίζονται πάντα σωστά με αιτήματα API. Αυτά τα πρόσθετα θα πρέπει ιδανικά να χρησιμοποιούνται μόνο για ανάπτυξη και όχι σε περιβάλλοντα παραγωγής. Για την παραγωγή, μια ασφαλέστερη και πιο αξιόπιστη προσέγγιση θα ήταν η χρήση ενός διακομιστή μεσολάβησης υποστήριξης που ζητά τα δεδομένα για λογαριασμό της εφαρμογής React, όπως φαίνεται στις λύσεις που παρέχονται προηγουμένως.

Μια άλλη πτυχή που πρέπει να λάβετε υπόψη είναι ο αποτελεσματικός χειρισμός των σφαλμάτων. Ενώ τα ζητήματα CORS είναι μια κοινή αιτία σφαλμάτων "Αποτυχία λήψης", άλλοι παράγοντες όπως η αστάθεια δικτύου, οι εσφαλμένες διευθύνσεις URL API ή ο χρόνος διακοπής λειτουργίας διακομιστή θα μπορούσαν επίσης να οδηγήσουν σε αυτό το σφάλμα. Ως εκ τούτου, είναι σημαντικό να εφαρμοστεί ισχυρός χειρισμός σφαλμάτων στον κώδικά σας, ειδικά όταν εργάζεστε με API τρίτων. Ένας σωστός μηχανισμός διαχείρισης σφαλμάτων θα βοηθήσει στην αποτελεσματικότερη διόρθωση του προβλήματος και θα παρέχει φιλικά προς τον χρήστη μηνύματα όταν κάτι πάει στραβά.

Συνήθεις ερωτήσεις σχετικά με τα αιτήματα CORS και API στο React

  1. Τι είναι το CORS και γιατί είναι σημαντικό;
  2. Το CORS (Cross-Origin Resource Sharing) είναι μια πολιτική ασφαλείας που επιβάλλεται από προγράμματα περιήγησης για την αποτροπή κακόβουλων αιτημάτων από μη αξιόπιστους τομείς. Διασφαλίζει ότι μόνο ορισμένοι τομείς επιτρέπεται να ανακτούν πόρους από έναν διακομιστή.
  3. Γιατί λαμβάνω "Unhandled Rejection (TypeError): Failed to fetch";
  4. Αυτό το σφάλμα παρουσιάζεται συνήθως όταν το αίτημά σας API έχει αποκλειστεί λόγω περιορισμών CORS. Μπορεί επίσης να προκαλείται από λανθασμένες διευθύνσεις URL API ή προβλήματα με τον διακομιστή.
  5. Τι κάνει το useEffect γάντζο κάνει σε αυτό το πλαίσιο;
  6. Ο useEffect Το hook in React χρησιμοποιείται για την ενεργοποίηση ενός αιτήματος API μετά την προσάρτηση του στοιχείου. Διασφαλίζει ότι η λειτουργία ανάκτησης πραγματοποιείται τη σωστή στιγμή, αποτρέποντας πολλαπλά περιττά αιτήματα.
  7. Πώς μπορώ να διορθώσω σφάλματα CORS σε μια εφαρμογή React;
  8. Για να διορθώσετε σφάλματα CORS, μπορείτε να χρησιμοποιήσετε έναν διακομιστή μεσολάβησης υποστήριξης, να ορίσετε τις κατάλληλες κεφαλίδες res.setHeader στον διακομιστή ή βασιστείτε σε υπηρεσίες όπως το CORS-Anywhere για σκοπούς ανάπτυξης.
  9. Μπορώ να χρησιμοποιήσω επεκτάσεις προγράμματος περιήγησης CORS στην παραγωγή;
  10. Όχι, οι επεκτάσεις προγράμματος περιήγησης CORS θα πρέπει να χρησιμοποιούνται μόνο για ανάπτυξη. Στην παραγωγή, είναι ασφαλέστερο να διαμορφώσετε το CORS στον διακομιστή ή να χρησιμοποιήσετε έναν διακομιστή μεσολάβησης.

Τελικές σκέψεις για τη διαχείριση σφαλμάτων CORS στο React

Τα σφάλματα CORS είναι μια κοινή πρόκληση κατά την ανάπτυξη εφαρμογών React που καταναλώνουν API τρίτων. Αν και οι επεκτάσεις του προγράμματος περιήγησης μπορούν να βοηθήσουν στην ανάπτυξη, είναι κρίσιμο να εφαρμοστούν πιο αξιόπιστες λύσεις όπως ένας διακομιστής μεσολάβησης σε περιβάλλοντα παραγωγής για τη διατήρηση της ασφάλειας και της ακεραιότητας των δεδομένων.

Χρησιμοποιώντας τις σωστές τεχνικές, όπως ο χειρισμός σφαλμάτων και οι λύσεις υποστήριξης, οι προγραμματιστές μπορούν να χειριστούν αποτελεσματικά ζητήματα όπως "Απέτυχε η ανάκτηση". Αυτό διασφαλίζει ότι η εφαρμογή τους παρέχει μια ομαλή εμπειρία χρήστη κατά την αλληλεπίδραση με API, βελτιώνοντας την απόδοση και τη λειτουργικότητα.

Αναφορές και Πηγαίο Υλικό για Κατανόηση Ζητημάτων CORS στο React
  1. Για λεπτομερείς πληροφορίες σχετικά με το Cross-Origin Resource Sharing (CORS) και τον τρόπο διαχείρισής του στο React, ανατρέξτε στο Έγγραφα Ιστού MDN στο CORS .
  2. Για να κατανοήσετε περισσότερα σχετικά με τα κοινά σφάλματα του React, όπως "Αποτυχία λήψης" και πιθανές λύσεις, ελέγξτε React Documentation on Error Boundaries .
  3. Εάν εργάζεστε με την Express για τη ρύθμιση ενός διακομιστή μεσολάβησης για την παράκαμψη προβλημάτων CORS, επισκεφτείτε το Express.js Routing και Middleware .
  4. Για βοήθεια σχετικά με τον τρόπο εργασίας με το Fetch API σε JavaScript, βλ Έγγραφα Ιστού MDN στο Fetch API .
  5. Εξερευνήστε πώς μπορείτε να χρησιμοποιήσετε το Swiggy's API για δεδομένα εστιατορίου στην επίσημη τεκμηρίωση του API: Swiggy API .