Obravnava napak API-ja v Reactu: Izzivi vtičnikov CORS
Pri delu z API-ji v ReactJS, se razvijalci pogosto srečujejo z različnimi izzivi, povezanimi s pridobivanjem podatkov, zlasti ko imajo opravka z API-ji tretjih oseb. Ena pogosta težava, ki se pojavi, je napaka »Neobravnavana zavrnitev (TypeError): pridobivanje ni uspelo«. Ta napaka se lahko pojavi tudi pri uporabi priljubljenih API-jev, kot je API seznama restavracij Swiggy, ki ga mnogi razvijalci uporabljajo za izboljšanje svojih spletnih aplikacij.
V tem primeru se morda zdi dodajanje razširitve za Chrome CORS izvedljiva rešitev za izogibanje omejevalnim pravilnikom brskalnika. Vendar lahko povzroči nove zaplete namesto rešitve težave. Če v svojem razvojnem okolju uporabljate vtičnik CORS in vaše zahteve API ne uspejo kmalu po nalaganju, lahko naletite na težavo, pri kateri je vtičnik v nasprotju z vedenjem brskalnika pri obravnavanju zahtev.
Razumevanje, kako upravljati navzkrižne zahteve in odpravljati težave Napake CORS v ReactJS je bistvenega pomena za nemoten razvojni proces. API-ji, kot je Swiggyjev, imajo pogosto nameščene varnostne plasti, kot je CORS, za nadzor dostopa nepooblaščenih strank. Te omejitve lahko povzročijo napake, ki jih je treba ustrezno odpraviti.
V tem priročniku bomo raziskali, zakaj pride do te napake, zlasti po dodajanju vtičnika CORS v Chrome. Razpravljali bomo tudi o strategijah za njegovo rešitev med delom z API-jem Swiggy v vašem Reagiraj aplikacije.
Ukaz | Primer uporabe |
---|---|
fetch() | Ta ukaz se uporablja za pošiljanje zahtev HTTP za API Swiggy. Vire pridobi asinhrono in vrne obljubo, ki se razreši v objekt Response. Je ključnega pomena za pridobivanje podatkov o restavracijah iz API-ja. |
useEffect() | Ta kavelj, ki se uporablja v Reactu, omogoča izvajanje stranskih učinkov, kot so klici API-ja po upodabljanju komponente. Zagotavlja, da je zahteva za pridobivanje v API-ju Swiggy narejena, ko je komponenta nameščena. |
res.setHeader() | Ta ukaz Express nastavi glave HTTP po meri, kot je npr Access-Control-Allow-Origin, ki je ključnega pomena pri ravnanju s CORS. Omogoča zaledju, da dovoli zahteve iz katerega koli izvora, kar preprečuje napake CORS. |
res.json() | Ta metoda se uporablja za pošiljanje odgovora JSON nazaj odjemalcu. V rešitvi strežnika proxy zagotavlja, da se podatki API-ja, pridobljeni iz Swiggyja, vrnejo kot format JSON, ki ga sprednji del zlahka uporabi. |
await | Ta ključna beseda začasno ustavi izvajanje asinhrone funkcije, dokler se operacija pridobivanja ne razreši, s čimer zagotovi, da koda počaka na podatke API-ja, preden nadaljuje, in prepreči neobravnavane zavrnitve. |
express() | The izraziti () funkcija se uporablja za ustvarjanje primerka strežnika Express. Ta strežnik deluje kot posrednik med vmesnikom in API-jem Swiggy, da prepreči težave s CORS med pridobivanjem podatkov. |
app.listen() | S tem ukazom strežnik Express začne poslušati dohodne zahteve na določenih vratih (npr. v tem primeru vrata 5000). Ključnega pomena je za lokalno gostovanje strežnika proxy med razvojem. |
try...catch | Ta blok obravnava napake, ki se lahko pojavijo med zahtevo za pridobivanje, kot so napake omrežja ali težave z API-jem Swiggy. Zagotavlja, da aplikacija elegantno obravnava napake, namesto da se zruši. |
Razlaga rešitev za težave CORS v React s Swiggy API
V prvi rešitvi smo ustvarili a Node.js backend z uporabo Expressa za obhod težave CORS pri pridobivanju podatkov o restavraciji iz Swiggyjevega API-ja. Politika CORS preprečuje, da bi brskalniki pošiljali zahteve drugi domeni, razen če ta domena to dovoljuje. Z ustvarjanjem preprostega strežnika lahko delujemo kot srednja plast med odjemalcem in API-jem, pri čemer pridobimo podatke na strani strežnika in jih vrnemo v sprednji del Reacta. Ta metoda se izogne napakam CORS, saj zahteva prihaja iz istega izvora kot odjemalska aplikacija.
Zaledje Express nastavi glave po meri, zlasti Access-Control-Allow-Origin, ki naši stranki omogoča, da zahteva vire brez omejitev CORS. Klic pridobivanja v Swiggyjev API se izvede na strani strežnika, podatki pa so vrnjeni v formatu JSON. Ta pristop se pogosto šteje za bolj varnega in zmogljivega v produkcijskih okoljih, saj skriva ključe API ali občutljive informacije. Poleg tega uporaba poskusnega ulova zagotavlja ustrezno obravnavo napak in prikaže uporabniku prijazna sporočila o napakah, če se API ne odzove.
V drugi rešitvi spremenimo zahtevo za pridobivanje na kodi React na strani odjemalca. Ta metoda vključuje dodajanje glav po meri v klic pridobivanja, kar zagotavlja, da je zahteva pravilno oblikovana, preden doseže API. Uporabljamo React-ove useEffect kavelj za sprožitev klica API, ko se komponenta namesti. Funkcija async čaka na odziv API-ja, ga pretvori v JSON in obravnava napake, če zahteva ne uspe. Vendar se ta rešitev še vedno sooča s težavami CORS, če API ne dovoljuje navzkrižnih zahtev neposredno iz brskalnikov.
Končno, v tretji rešitvi uporabljamo storitev tretje osebe, imenovano CORS-Anywhere. To je storitev vmesne programske opreme, ki začasno pomaga obiti omejitve CORS s preusmeritvijo zahteve API prek njihovega strežnika. Čeprav lahko ta rešitev deluje v razvojnih okoljih, ni priporočljiva za proizvodnjo zaradi varnostnih tveganj in odvisnosti od zunanjih storitev. Uvaja tudi dodatne stroške glede zmogljivosti, saj dodaja dodatno plast procesu pridobivanja podatkov. Uporaba te metode je lahko priročna med fazami testiranja, vendar se ji je treba iz varnostnih razlogov izogibati v proizvodnji.
1. rešitev: obravnavanje težav CORS s strežnikom proxy
Ta rešitev uporablja zaledni strežnik proxy Node.js, da se izogne napakam CORS in pravilno pridobi podatke iz API-ja 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}`);
});
2. rešitev: Uporaba sprednjega pridobivanja z glavami po meri in obravnavanjem napak
Ta pristop spremeni zahtevo za pridobivanje neposredno v Reactu, dodaja glave po meri in učinkovito obravnava napake.
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;
Rešitev 3: Uporaba vmesne programske opreme CORS-Anywhere za razvoj
Ta metoda uporablja storitev "CORS-Anywhere" za izogibanje omejitvam CORS v razvojnem načinu. Ta rešitev se ne sme uporabljati v proizvodnji.
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;
Odpravljanje težav s CORS v zahtevah API
Eden od osnovnih razlogov za napako »Failed to fetch« v aplikaciji React, zlasti pri uporabi API-jev tretjih oseb, kot je Swiggy, je CORS (Cross-Origin Resource Sharing) omejitve. CORS je varnostna funkcija, ki spletnim aplikacijam omejuje pošiljanje zahtev v domeno, ki se razlikuje od tiste, iz katere so bile postrežene. V tem primeru API Swiggy zavrne zahtevo, ker izvira iz druge domene (vaše aplikacije React). To je še posebej problematično, ko pridobivate podatke iz API-jev, ki izrecno ne podpirajo navzkrižnih zahtev.
Običajna rešitev je uporaba razširitev brskalnika, kot je razširitev za Chrome »Dovoli CORS«. Vendar lahko takšne razširitve povzročijo nedosledne rezultate. To je zato, ker manipulirajo z nastavitvami na ravni brskalnika, ki se ne sinhronizirajo vedno pravilno z zahtevami API-ja. Idealno bi bilo, da se ti vtičniki uporabljajo samo za razvoj in ne v produkcijskih okoljih. Za produkcijo bi bil varnejši in zanesljivejši pristop uporaba zalednega strežnika proxy, ki zahteva podatke v imenu vaše aplikacije React, kot je razvidno iz prejšnjih rešitev.
Drug vidik, ki ga je treba upoštevati, je učinkovito ravnanje z napakami. Čeprav so težave s CORS pogost vzrok za napake »Pridobivanje ni uspelo«, lahko to napako povzročijo tudi drugi dejavniki, kot so nestabilnost omrežja, nepravilni URL-ji API-jev ali izpad strežnika. Zato je pomembno izvajati robustno obravnavanje napak v vaši kodi, zlasti pri delu z API-ji tretjih oseb. Ustrezen mehanizem za obravnavo napak bo pomagal učinkoviteje odpraviti napako in zagotovil uporabniku prijazna sporočila, ko gre kaj narobe.
Pogosta vprašanja o zahtevah CORS in API v Reactu
- Kaj je CORS in zakaj je pomemben?
- CORS (Cross-Origin Resource Sharing) je varnostna politika, ki jo izvajajo brskalniki za preprečevanje zlonamernih zahtev iz nezaupljivih domen. Zagotavlja, da je samo določenim domenam dovoljeno pridobivanje virov s strežnika.
- Zakaj prejemam "Neobravnavana zavrnitev (TypeError): Pridobivanje ni uspelo"?
- Ta napaka se običajno pojavi, ko je vaša zahteva API blokirana zaradi omejitev CORS. Vzrok so lahko tudi nepravilni URL-ji API-jev ali težave s strežnikom.
- Kaj pomeni useEffect hook narediti v tem kontekstu?
- The useEffect hook v React se uporablja za sprožitev zahteve API po namestitvi komponente. Zagotavlja, da se operacija pridobivanja izvede ob pravem času in preprečuje večkratne nepotrebne zahteve.
- Kako lahko popravim napake CORS v aplikaciji React?
- Če želite popraviti napake CORS, lahko uporabite zaledni proxy, nastavite ustrezne glave z res.setHeader v strežniku ali pa se za razvojne namene zanašajte na storitve, kot je CORS-Anywhere.
- Ali lahko v produkciji uporabljam razširitve brskalnika CORS?
- Ne, razširitve brskalnika CORS je treba uporabljati samo za razvoj. V proizvodnji je varneje konfigurirati CORS na strežniku ali uporabiti strežnik proxy.
Končne misli o upravljanju napak CORS v Reactu
Napake CORS so pogost izziv pri razvoju aplikacij React, ki uporabljajo API-je tretjih oseb. Čeprav lahko razširitve brskalnika pomagajo pri razvoju, je ključnega pomena implementacija zanesljivejših rešitev, kot je strežnik proxy, v proizvodnih okoljih, da se ohrani varnost in celovitost podatkov.
Z uporabo pravih tehnik, kot so obravnavanje napak in zaledne rešitve, lahko razvijalci učinkovito obravnavajo težave, kot je »Pridobivanje ni uspelo«. To zagotavlja, da njihova aplikacija zagotavlja nemoteno uporabniško izkušnjo pri interakciji z API-ji, s čimer izboljša učinkovitost in funkcionalnost.
Reference in izvorno gradivo za razumevanje vprašanj CORS v Reactu
- Za podrobne informacije o skupni rabi virov med izvori (CORS) in o tem, kako jo upravljati v Reactu, glejte Spletni dokumenti MDN na CORS .
- Če želite izvedeti več o pogostih napakah React, kot je »Pridobivanje ni uspelo«, in možnih rešitvah, preverite React dokumentacija o mejah napak .
- Če delate s Expressom za nastavitev proxy strežnika, da bi zaobšel težave s CORS, obiščite Usmerjanje Express.js in vmesna programska oprema .
- Za pomoč pri delu z API-jem Fetch v JavaScriptu glejte MDN Web Docs on Fetch API .
- Raziščite, kako uporabljati Swiggyjev API za podatke o restavracijah v uradni dokumentaciji API-ja: Swiggy API .