API klaidų tvarkymas „React“: CORS papildinio iššūkiai
Kai dirbate su API ReaguotiJS, kūrėjai dažnai susiduria su įvairiais iššūkiais, susijusiais su duomenų gavimu, ypač kai susiduria su trečiųjų šalių API. Viena dažnai kylanti problema yra klaida „Neapdorotas atmetimas (tipo klaida): nepavyko gauti“. Ši klaida gali atsirasti net naudojant populiarias API, pvz., Swiggy restoranų sąrašo API, kurią daugelis kūrėjų naudoja tobulindami žiniatinklio programas.
Šiuo atveju CORS Chrome plėtinio pridėjimas gali atrodyti kaip tinkamas sprendimas apeiti ribojančias naršyklės taisykles. Tačiau tai gali sukelti naujų komplikacijų, o ne išspręsti problemą. Jei kūrimo aplinkoje naudojate CORS papildinį, o jūsų API užklausos nepavyksta netrukus po įkėlimo, gali kilti problema, kai papildinys prieštarauja naršyklės užklausų apdorojimo elgsenai.
Supratimas, kaip valdyti įvairių šaltinių užklausas ir šalinti triktis CORS klaidos ReactJS yra būtinas sklandžiam kūrimo procesui. Tokios API kaip „Swiggy's“ dažnai turi saugos sluoksnius, pvz., CORS, skirtus kontroliuoti neteisėtų klientų prieigą. Šie apribojimai gali sukelti klaidų, kurias reikia tinkamai pašalinti.
Šiame vadove išnagrinėsime, kodėl įvyksta ši klaida, ypač pridėjus CORS papildinį „Chrome“. Taip pat aptarsime strategijas, kaip ją išspręsti dirbdami su Swiggy API Reaguoti programas.
komandą | Naudojimo pavyzdys |
---|---|
fetch() | Ši komanda naudojama HTTP užklausoms pateikti Swiggy API. Jis asinchroniškai nuskaito išteklius ir grąžina pažadą, kuris paverčiamas atsako objektu. Tai labai svarbu norint gauti restorano duomenis iš API. |
useEffect() | Naudojamas React, šis kabliukas leidžia atlikti šalutinį poveikį, pvz., API iškvietimus po komponento pateikimo. Tai užtikrina, kad „Swiggy“ API gavimo užklausa būtų pateikta prijungus komponentą. |
res.setHeader() | Ši Express komanda nustato pasirinktines HTTP antraštes, pvz Prieiga-Control-Allow-Origin, kuris yra labai svarbus tvarkant CORS. Tai leidžia užpakalinei programai leisti bet kokios kilmės užklausas, užkertant kelią CORS klaidoms. |
res.json() | Šis metodas naudojamas siųsti JSON atsakymą atgal klientui. Tarpinio serverio sprendime jis užtikrina, kad API duomenys, gauti iš „Swiggy“, būtų grąžinti JSON formatu, kurį priekinė dalis gali lengvai naudoti. |
await | Šis raktinis žodis pristabdo asinchroninės funkcijos vykdymą, kol bus atlikta gavimo operacija, užtikrinant, kad kodas lauktų API duomenų prieš tęsdamas, taip užkertant kelią netvarkomiems atmetimams. |
express() | The išreikšti () funkcija naudojama Express serverio egzemplioriui sukurti. Šis serveris veikia kaip tarpinis serveris tarp sąsajos ir Swiggy API, kad būtų išvengta CORS problemų gaunant duomenis. |
app.listen() | Ši komanda leidžia „Express“ serveriui pradėti klausytis gaunamų užklausų nurodytu prievadu (pvz., šiuo atveju 5000 prievadu). Tai labai svarbu, kad tarpinio serverio priegloba būtų vietoje kūrimo metu. |
try...catch | Šis blokas tvarko klaidas, kurios gali atsirasti gavimo užklausos metu, pvz., tinklo gedimus arba problemas, susijusias su Swiggy API. Tai užtikrina, kad programa grakščiai tvarkytų klaidas, o ne strigtų. |
CORS problemų sprendimų paaiškinimas „React“ naudojant „Swiggy“ API
Pirmajame sprendime sukūrėme a Node.js backend naudojant Express, kad apeitų CORS problemą, kai gaunami restorano duomenys iš Swiggy API. CORS politika neleidžia naršyklėms teikti užklausų kitam domenui, nebent tas domenas tai leidžia. Sukūrę paprastą serverį, galime veikti kaip vidurinis sluoksnis tarp kliento ir API, paimdami duomenis iš serverio ir grąžindami juos į React sąsają. Šis metodas leidžia išvengti CORS klaidų, nes užklausa gaunama iš tos pačios kilmės kaip ir kliento programa.
„Express backend“ nustato pasirinktines antraštes, ypač Prieiga-Control-Allow-Origin, kuri leidžia mūsų klientui prašyti išteklių nepatiriant CORS apribojimų. Swiggy API iškvietimas atliekamas serverio pusėje, o duomenys grąžinami JSON formatu. Šis metodas dažnai laikomas saugesniu ir našesniu gamybinėje aplinkoje, nes paslepia API raktus arba neskelbtiną informaciją. Be to, try-catch naudojimas užtikrina tinkamą klaidų tvarkymą ir pateikia patogius klaidų pranešimus, jei API nereaguoja.
Antrajame sprendime modifikuojame gavimo užklausą kliento pusės „React“ kode. Šis metodas apima tinkintų antraščių įtraukimą į iškvietimo iškvietimą, užtikrinant, kad užklausa būtų tinkamai suformatuota prieš pasiekiant API. Mes naudojame React's naudojimoEfektas kabliukas, kad suaktyvintų API iškvietimą, kai komponentas pritvirtinamas. Asinchronizavimo funkcija laukia API atsakymo, konvertuoja jį į JSON ir apdoroja klaidas, jei užklausa nepavyksta. Tačiau šis sprendimas vis tiek susiduria su CORS problemomis, jei API neleidžia tiesiogiai pateikti kelių šaltinių užklausų iš naršyklių.
Galiausiai, trečiajame sprendime naudojame trečiosios šalies paslaugą, vadinamą CORS-Anywhere. Tai tarpinės programinės įrangos paslauga, kuri laikinai padeda apeiti CORS apribojimus, nukreipdama API užklausą per jų serverį. Nors šis sprendimas gali veikti kūrimo aplinkoje, jis nerekomenduojamas gamybai dėl saugumo rizikos ir priklausomybės nuo išorinių paslaugų. Tai taip pat padidina našumo išlaidas, nes prideda papildomą duomenų gavimo proceso sluoksnį. Šio metodo naudojimas gali būti patogus bandymo etapuose, tačiau saugumo sumetimais jo reikėtų vengti gamyboje.
1 sprendimas: CORS problemų tvarkymas naudojant tarpinį serverį
Šiame sprendime naudojamas Node.js užpakalinis tarpinis serveris, kad būtų išvengta CORS klaidų ir būtų tinkamai gauti duomenys iš 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 sprendimas: naudokite Front-End Fetch su tinkintomis antraštėmis ir klaidų tvarkymu
Šis metodas pakeičia gavimo užklausą tiesiogiai sistemoje „React“, prideda pasirinktines antraštes ir efektyviai tvarko klaidas.
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 sprendimas: naudokite CORS-Anywhere tarpinę programinę įrangą kuriant
Šis metodas naudoja „CORS-Anywhere“ paslaugą, kad apeitų CORS apribojimus kūrimo režimu. Šis sprendimas neturėtų būti naudojamas gamyboje.
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 trikčių šalinimas API užklausose
Viena iš pagrindinių „React“ programos klaidos „Nepavyko gauti“ priežasčių, ypač naudojant trečiųjų šalių API, pvz., „Swiggy“, yra CORS (Kryžminio šaltinio išteklių bendrinimo) apribojimai. CORS yra saugos funkcija, kuri neleidžia žiniatinklio programoms teikti užklausų kitam domenui nei tas, iš kurio jos buvo aptarnaujamos. Šiuo atveju „Swiggy“ API užklausą atmeta, nes ji kilusi iš kito domeno (jūsų „React“ programos). Tai ypač sudėtinga, kai gaunate duomenis iš API, kurios aiškiai nepalaiko kelių šaltinių užklausų.
Įprastas sprendimas yra naudoti naršyklės plėtinius, pvz., „Chrome“ plėtinį „Leisti CORS“. Tačiau tokie plėtiniai gali duoti nenuoseklių rezultatų. Taip yra todėl, kad jie manipuliuoja naršyklės lygio nustatymais, kurie ne visada tinkamai sinchronizuojasi su API užklausomis. Idealiu atveju šie papildiniai turėtų būti naudojami tik kuriant, o ne gamybinėje aplinkoje. Gamyboje saugesnis ir patikimesnis būdas būtų naudoti tarpinį serverį, kuris prašo duomenų jūsų „React“ programos vardu, kaip matyti iš anksčiau pateiktų sprendimų.
Kitas aspektas, į kurį reikia atsižvelgti, yra veiksmingas klaidų valdymas. Nors CORS problemos yra dažna klaidų „Nepavyko gauti“ priežastis, šią klaidą taip pat gali sukelti kiti veiksniai, pvz., tinklo nestabilumas, neteisingi API URL arba serverio prastovos. Todėl svarbu įgyvendinti patikimas klaidų valdymas savo kode, ypač kai dirbate su trečiųjų šalių API. Tinkamas klaidų apdorojimo mechanizmas padės veiksmingiau derinti problemą ir pateikti patogius pranešimus, kai kas nors negerai.
Dažni klausimai apie CORS ir API užklausas „React“.
- Kas yra CORS ir kodėl tai svarbu?
- CORS (angl. Cross-Origin Resource Sharing) – tai saugumo politika, kurią įgyvendina naršyklės, siekiant užkirsti kelią kenkėjiškoms užklausoms iš nepatikimų domenų. Tai užtikrina, kad tik tam tikriems domenams būtų leista gauti išteklius iš serverio.
- Kodėl gaunu pranešimą „Neapdorotas atmetimas (tipo klaida): nepavyko gauti“?
- Ši klaida paprastai atsiranda, kai jūsų API užklausa užblokuojama dėl CORS apribojimų. Tai taip pat gali sukelti neteisingi API URL arba serverio problemos.
- Ką daro useEffect kabliukas daryti šiame kontekste?
- The useEffect „hook in React“ naudojamas API užklausai suaktyvinti po komponento prijungimo. Tai užtikrina, kad gavimo operacija įvyktų tinkamu laiku, užkertant kelią daugybei nereikalingų užklausų.
- Kaip galiu ištaisyti CORS klaidas „React“ programoje?
- Norėdami ištaisyti CORS klaidas, galite naudoti tarpinį serverį ir nustatyti tinkamas antraštes res.setHeader serveryje arba kūrimo tikslais pasikliaukite tokiomis paslaugomis kaip CORS-Anywhere.
- Ar galiu naudoti CORS naršyklės plėtinius gamyboje?
- Ne, CORS naršyklės plėtiniai turėtų būti naudojami tik kuriant. Gamyboje saugiau sukonfigūruoti CORS serveryje arba naudoti tarpinį serverį.
Paskutinės mintys apie CORS klaidų valdymą „React“.
CORS klaidos yra dažnas iššūkis kuriant „React“ programas, kurios naudoja trečiųjų šalių API. Nors naršyklės plėtiniai gali padėti kuriant, labai svarbu gamybinėje aplinkoje įdiegti patikimesnius sprendimus, pvz., tarpinį serverį, kad būtų išlaikytas saugumas ir duomenų vientisumas.
Naudodami tinkamus metodus, pvz., klaidų apdorojimą ir vidinius sprendimus, kūrėjai gali efektyviai spręsti tokias problemas kaip „Nepavyko gauti“. Taip užtikrinama, kad jų programa užtikrins sklandžią vartotojo patirtį sąveikaujant su API, padidindama našumą ir funkcionalumą.
Nuorodos ir šaltinio medžiaga, skirta suprasti CORS problemas „React“.
- Išsamios informacijos apie įvairių šaltinių išteklių bendrinimą (CORS) ir kaip jį valdyti React, žr. MDN žiniatinklio dokumentai CORS .
- Norėdami daugiau sužinoti apie įprastas „React“ klaidas, pvz., „Nepavyko gauti“, ir galimus sprendimus, patikrinkite Reaguokite į klaidų ribų dokumentus .
- Jei dirbate su Express, kad nustatytumėte tarpinį serverį, kad būtų išvengta CORS problemų, apsilankykite Express.js maršruto parinkimas ir tarpinė programinė įranga .
- Jei reikia pagalbos, kaip dirbti su „Fetch“ API „JavaScript“, žr MDN žiniatinklio dokumentai Fetch API .
- Sužinokite, kaip naudoti Swiggy API restoranų duomenims oficialioje API dokumentacijoje: Swiggy API .