Håndtering av API-feil i React: CORS-plugin-utfordringer
Når du arbeider med APIer i ReactJS, støter utviklere ofte på ulike utfordringer knyttet til datahenting, spesielt når de arbeider med tredjeparts APIer. Et vanlig problem som oppstår er feilen "Ubehandlet avvisning (TypeError): Kunne ikke hente". Denne feilen kan oppstå selv når du bruker populære APIer som Swiggys restaurantliste-API, som mange utviklere bruker for å forbedre nettapplikasjonene sine.
I dette tilfellet kan det å legge til en CORS Chrome-utvidelse virke som en levedyktig løsning for å omgå restriktive nettleserpolicyer. Imidlertid kan det introdusere nye komplikasjoner i stedet for å løse problemet. Hvis du bruker en CORS-plugin i utviklingsmiljøet ditt, og API-forespørslene dine mislykkes kort tid etter lasting, kan det hende du får et problem der plugin-en er i konflikt med nettleserens forespørselshåndtering.
Forstå hvordan du håndterer forespørsler på tvers av opprinnelse og feilsøker CORS feil i ReactJS er avgjørende for en jevn utviklingsprosess. APIer som Swiggys har ofte sikkerhetslag, som CORS, på plass for å kontrollere tilgang fra uautoriserte klienter. Disse begrensningene kan føre til feil som må løses på riktig måte.
I denne veiledningen vil vi utforske hvorfor denne feilen oppstår, spesielt etter å ha lagt til en CORS-plugin i Chrome. Vi vil også diskutere strategier for å løse det mens du arbeider med Swiggy API i din Reagere applikasjoner.
Kommando | Eksempel på bruk |
---|---|
fetch() | Denne kommandoen brukes til å sende HTTP-forespørsler til Swiggy API. Den henter ressurser asynkront og returnerer et løfte, som løses til et Response-objekt. Det er nøkkelen for å hente restaurantdata fra API. |
useEffect() | Brukt i React, tillater denne kroken utførelse av bivirkninger som API-kall etter gjengivelse av komponenten. Det sikrer at hentingsforespørselen til Swiggys API blir gjort når komponenten er montert. |
res.setHeader() | Denne Express-kommandoen setter tilpassede HTTP-hoder, som f.eks Access-Control-Allow-Origin, som er avgjørende i CORS-håndtering. Det gjør det mulig for backend å tillate forespørsler fra enhver opprinnelse, og forhindrer CORS-feil. |
res.json() | Denne metoden brukes til å sende et JSON-svar tilbake til klienten. I proxy-serverløsningen sikrer den at API-dataene hentet fra Swiggy returneres som JSON-format, som grensesnittet enkelt kan konsumere. |
await | Dette nøkkelordet stanser utførelsen av den asynkrone funksjonen til henteoperasjonen løser seg, og sikrer at koden venter på API-dataene før den fortsetter, og forhindrer ubehandlede avvisninger. |
express() | De uttrykke() funksjonen brukes til å lage en forekomst av en Express-server. Denne serveren fungerer som en proxy mellom frontend og Swiggy API for å forhindre CORS-problemer under datahenting. |
app.listen() | Denne kommandoen får Express-serveren til å begynne å lytte etter innkommende forespørsler på en spesifisert port (f.eks. port 5000 i dette tilfellet). Det er avgjørende for å være vert for proxy-serveren lokalt under utvikling. |
try...catch | Denne blokken håndterer feil som kan oppstå under hentingsforespørselen, for eksempel nettverksfeil eller problemer med Swiggy API. Det sikrer at appen på en elegant måte håndterer feil i stedet for å krasje. |
Forklarer løsninger for CORS-problemer i React med Swiggy API
I den første løsningen laget vi en Node.js backend som bruker Express for å omgå CORS-problemet når du henter restaurantdataene fra Swiggys API. CORS-policyen forhindrer nettlesere fra å sende forespørsler til et annet domene med mindre dette domenet tillater det. Ved å lage en enkel server kan vi fungere som et mellomlag mellom klienten og API, hente dataserversiden og returnere den til React-fronten. Denne metoden unngår CORS-feil siden forespørselen kommer fra samme opprinnelse som klientappen.
Express-backend setter opp tilpassede overskrifter, spesielt Access-Control-Allow-Origin, som lar vår klient be om ressursene uten å møte CORS-begrensninger. Hentingskallet til Swiggys API gjøres på serversiden, og dataene returneres i JSON-format. Denne tilnærmingen anses ofte som sikrere og mer effektiv i produksjonsmiljøer siden den skjuler API-nøkler eller sensitiv informasjon. Videre sikrer bruk av try-catch riktig feilhåndtering, og viser brukervennlige feilmeldinger hvis API-en ikke svarer.
I den andre løsningen endrer vi henteforespørselen på React-koden på klientsiden. Denne metoden innebærer å legge til egendefinerte overskrifter i hentekallet, og sikre at forespørselen er riktig formatert før den når API-en. Vi bruker React's useEffect krok for å utløse API-kallet når komponenten monteres. Asynkronfunksjonen venter på API-svaret, konverterer det til JSON og håndterer feil hvis forespørselen mislykkes. Denne løsningen har imidlertid fortsatt CORS-problemer hvis API-en ikke tillater kryssopprinnelsesforespørsler fra nettlesere direkte.
Til slutt, i den tredje løsningen, bruker vi en tredjepartstjeneste kalt CORS-Anywhere. Dette er en mellomvaretjeneste som midlertidig hjelper med å omgå CORS-begrensninger ved å omdirigere API-forespørselen gjennom serveren deres. Selv om denne løsningen kan fungere i utviklingsmiljøer, anbefales den ikke for produksjon på grunn av sikkerhetsrisikoer og avhengighet av eksterne tjenester. Den introduserer også ytelsesoverhead da den legger til et ekstra lag til datahentingsprosessen. Å bruke denne metoden kan være praktisk under testfaser, men bør unngås i produksjon av sikkerhetsmessige årsaker.
Løsning 1: Håndtering av CORS-problemer med proxy-server
Denne løsningen bruker en Node.js backend proxy-server for å unngå CORS-feil og hente data på riktig måte fra 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}`);
});
Løsning 2: Bruke Front-End Fetch med tilpassede overskrifter og feilhåndtering
Denne tilnærmingen endrer henteforespørselen direkte i React, legger til tilpassede overskrifter og håndterer feil effektivt.
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;
Løsning 3: Bruk av CORS-Anywhere Middleware for utvikling
Denne metoden bruker "CORS-Anywhere"-tjenesten for å omgå CORS-begrensninger mens den er i utviklingsmodus. Denne løsningen skal ikke brukes i produksjon.
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;
Feilsøking av CORS-problemer i API-forespørsler
En av de underliggende årsakene til feilen "Kunnet ikke hente" i en React-applikasjon, spesielt når du bruker tredjeparts APIer som Swiggy, er CORS (Cross-Origin Resource Sharing) restriksjoner. CORS er en sikkerhetsfunksjon som begrenser nettapplikasjoner fra å sende forespørsler til et annet domene enn det de ble servert fra. I dette tilfellet avviser Swiggy API forespørselen fordi den kommer fra et annet domene (React-appen din). Dette er spesielt problematisk når du henter data fra APIer som ikke eksplisitt støtter kryssopprinnelsesforespørsler.
En vanlig løsning er å bruke nettleserutvidelser som «Allow CORS» Chrome-utvidelsen. Imidlertid kan slike utvidelser føre til inkonsekvente resultater. Dette er fordi de manipulerer innstillinger på nettlesernivå som ikke alltid synkroniseres riktig med API-forespørsler. Disse pluginene bør ideelt sett kun brukes til utvikling og ikke i produksjonsmiljøer. For produksjon vil en tryggere og mer pålitelig tilnærming være å bruke en backend proxy-server som ber om dataene på vegne av React-appen din, som vist i løsningene som ble gitt tidligere.
Et annet aspekt å vurdere er å håndtere feil effektivt. Selv om CORS-problemer er en vanlig årsak til «Kunne ikke hente»-feil, kan andre faktorer som nettverksustabilitet, feil API-URL-er eller servernedetid også føre til denne feilen. Derfor er det viktig å implementere robust feilhåndtering i koden din, spesielt når du arbeider med tredjeparts APIer. En riktig feilhåndteringsmekanisme vil bidra til å feilsøke problemet mer effektivt og gi brukervennlige meldinger når noe går galt.
Vanlige spørsmål om CORS og API-forespørsler i React
- Hva er CORS og hvorfor er det viktig?
- CORS (Cross-Origin Resource Sharing) er en sikkerhetspolicy håndhevet av nettlesere for å forhindre ondsinnede forespørsler fra uklarerte domener. Det sikrer at bare visse domener har lov til å hente ressurser fra en server.
- Hvorfor får jeg "Ubehandlet avvisning (TypeError): Kunne ikke hente"?
- Denne feilen oppstår vanligvis når API-forespørselen din er blokkert på grunn av CORS-begrensninger. Det kan også være forårsaket av feil API-URLer eller problemer med serveren.
- Hva betyr useEffect hekte gjøre i denne sammenhengen?
- De useEffect Hook in React brukes til å utløse en API-forespørsel etter at komponenten er montert. Det sikrer at henteoperasjonen skjer til rett tid, og forhindrer flere unødvendige forespørsler.
- Hvordan kan jeg fikse CORS-feil i en React-applikasjon?
- For å fikse CORS-feil kan du bruke en backend-proxy, angi riktige overskrifter med res.setHeader i serveren, eller stole på tjenester som CORS-Anywhere for utviklingsformål.
- Kan jeg bruke CORS nettleserutvidelser i produksjon?
- Nei, CORS nettleserutvidelser skal bare brukes til utvikling. I produksjon er det tryggere å konfigurere CORS på serveren eller bruke en proxy-server.
Siste tanker om håndtering av CORS-feil i React
CORS-feil er en vanlig utfordring når man utvikler React-applikasjoner som bruker tredjeparts APIer. Selv om nettleserutvidelser kan hjelpe i utviklingen, er det avgjørende å implementere mer pålitelige løsninger som en proxy-server i produksjonsmiljøer for å opprettholde sikkerhet og dataintegritet.
Ved å bruke de riktige teknikkene, som feilhåndtering og backend-løsninger, kan utviklere effektivt håndtere problemer som «Kunnet ikke hente». Dette sikrer at applikasjonen deres gir en jevn brukeropplevelse når de samhandler med APIer, og forbedrer ytelsen og funksjonaliteten.
Referanser og kildemateriale for å forstå CORS-problemer i React
- For detaljert informasjon om Cross-Origin Resource Sharing (CORS) og hvordan du administrerer det i React, se MDN Web Docs på CORS .
- For å forstå mer om vanlige React-feil som «Kunnet ikke hente» og potensielle løsninger, sjekk Reager dokumentasjon på feilgrenser .
- Hvis du jobber med Express for å sette opp en proxy-server for å omgå CORS-problemer, besøk Express.js-ruting og mellomvare .
- For hjelp til hvordan du arbeider med Fetch API i JavaScript, se MDN Web Docs på Fetch API .
- Utforsk hvordan du bruker Swiggys API for restaurantdata i den offisielle API-dokumentasjonen: Swiggy API .