Обробка помилок API у React: виклики плагіна CORS
При роботі з 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. Це дозволяє серверній частині дозволяти запити з будь-якого походження, запобігаючи помилкам CORS. |
res.json() | Цей метод використовується для надсилання клієнту відповіді JSON. У рішенні проксі-сервера воно гарантує, що дані API, отримані від Swiggy, повертаються у форматі JSON, який інтерфейс може легко використовувати. |
await | Це ключове слово призупиняє виконання асинхронної функції до завершення операції вибірки, гарантуючи, що код очікує даних API перед продовженням, запобігаючи необробленим відхиленням. |
express() | The експрес() функція використовується для створення екземпляра сервера Express. Цей сервер діє як проксі-сервер між інтерфейсом і Swiggy API, щоб запобігти проблемам CORS під час отримання даних. |
app.listen() | Ця команда змушує Express-сервер почати прослуховування вхідних запитів на вказаному порту (наприклад, порт 5000 у цьому випадку). Це важливо для локального розміщення проксі-сервера під час розробки. |
try...catch | Цей блок обробляє помилки, які можуть виникнути під час запиту на вибірку, наприклад збої мережі або проблеми з API Swiggy. Це гарантує, що програма витончено обробляє помилки замість збою. |
Пояснення рішень для проблем CORS у React за допомогою Swiggy API
У першому рішенні ми створили a Node.js бекенда за допомогою Express, щоб обійти проблему CORS під час отримання даних ресторану з API Swiggy. Політика CORS забороняє браузерам робити запити до іншого домену, якщо цей домен не дозволяє це. Створивши простий сервер, ми можемо діяти як проміжний рівень між клієнтом і API, забираючи дані на стороні сервера та повертаючи їх до інтерфейсу React. Цей метод дозволяє уникнути помилок CORS, оскільки запит надходить із того самого джерела, що й клієнтська програма.
Сервер Express налаштовує спеціальні заголовки, зокрема Access-Control-Allow-Origin, що дозволяє нашому клієнту запитувати ресурси, не стикаючись із обмеженнями CORS. Виклик fetch до API Swiggy виконується на стороні сервера, а дані повертаються у форматі JSON. Цей підхід часто вважається більш безпечним і продуктивним у виробничих середовищах, оскільки він приховує ключі API або конфіденційну інформацію. Крім того, використання try-catch забезпечує правильну обробку помилок, відображаючи зручні повідомлення про помилки, якщо API не відповідає.
У другому рішенні ми змінюємо запит на вибірку в коді React на стороні клієнта. Цей метод передбачає додавання користувацьких заголовків у виклик fetch, гарантуючи, що запит правильно відформатований перед досягненням 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. Використання зовнішньої вибірки з користувацькими заголовками та обробкою помилок
Цей підхід змінює запит на вибірку безпосередньо в 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 Обмеження (Cross-Origin Resource Sharing). CORS — це функція безпеки, яка забороняє веб-додаткам надсилати запити до домену, відмінного від того, з якого вони обслуговуються. У цьому випадку API Swiggy відхиляє запит, оскільки він походить з іншого домену (вашої програми React). Це особливо проблематично, коли ви отримуєте дані з API, які явно не підтримують перехресні запити.
Загальним обхідним шляхом є використання розширень веб-переглядача, як-от розширення Chrome «Дозволити CORS». Однак такі розширення можуть призвести до суперечливих результатів. Це тому, що вони маніпулюють налаштуваннями на рівні браузера, які не завжди належним чином синхронізуються із запитами API. В ідеалі ці плагіни слід використовувати лише для розробки, а не у виробничих середовищах. Для виробництва безпечнішим і надійнішим підходом було б використання внутрішнього проксі-сервера, який запитує дані від імені вашого додатка React, як це видно в наданих раніше рішеннях.
Ще один аспект, який слід враховувати, — це ефективна обробка помилок. Хоча проблеми з CORS є поширеною причиною помилок «Не вдалося отримати», інші фактори, як-от нестабільність мережі, неправильні URL-адреси API або простої сервера, також можуть призвести до цієї помилки. Тому це важливо впроваджувати надійна обробка помилок у вашому коді, особливо під час роботи зі сторонніми API. Належний механізм обробки помилок допоможе ефективніше усунути проблему та надасть зручні повідомлення, коли щось піде не так.
Поширені запитання щодо запитів CORS та API у React
- Що таке CORS і чому він важливий?
- CORS (Cross-Origin Resource Sharing) — це політика безпеки, яку застосовують браузери для запобігання зловмисним запитам із ненадійних доменів. Це гарантує, що лише певним доменам дозволено отримувати ресурси з сервера.
- Чому я отримую "Необроблене відхилення (TypeError): Не вдалося отримати"?
- Ця помилка зазвичай виникає, коли ваш запит API заблоковано через обмеження CORS. Це також може бути викликано неправильними URL-адресами API або проблемами з сервером.
- Що означає useEffect гачок робити в цьому контексті?
- The useEffect хук у React використовується для запуску запиту API після монтування компонента. Це гарантує, що операція вибірки виконується в потрібний час, запобігаючи численним непотрібним запитам.
- Як я можу виправити помилки CORS у програмі React?
- Щоб виправити помилки CORS, ви можете використовувати серверний проксі, установивши відповідні заголовки res.setHeader на сервері або покладатися на такі служби, як CORS-Anywhere, для цілей розробки.
- Чи можу я використовувати розширення браузера CORS у виробництві?
- Ні, розширення браузера CORS слід використовувати лише для розробки. У виробництві безпечніше налаштувати CORS на сервері або використовувати проксі-сервер.
Останні думки щодо керування помилками CORS у React
Помилки CORS є типовою проблемою під час розробки додатків React, які використовують сторонні API. Хоча розширення веб-переглядача можуть допомогти в розробці, дуже важливо впроваджувати більш надійні рішення, такі як проксі-сервер, у робочих середовищах для підтримки безпеки та цілісності даних.
Використовуючи правильні методи, такі як обробка помилок і серверні рішення, розробники можуть ефективно вирішувати такі проблеми, як «Не вдалося отримати». Це гарантує, що їхня програма забезпечує безперебійну роботу користувача під час взаємодії з API, підвищуючи продуктивність і функціональність.
Посилання та вихідний матеріал для розуміння проблем CORS у React
- Щоб отримати докладну інформацію про обмін ресурсами між джерелами (CORS) і як ним керувати в React, зверніться до Веб-документи MDN на CORS .
- Щоб дізнатися більше про типові помилки React, як-от «Не вдалося отримати», і потенційні рішення, перевірте Документація React щодо меж помилок .
- Якщо ви працюєте з Express для налаштування проксі-сервера для обходу проблем CORS, відвідайте Маршрутизація та проміжне програмне забезпечення Express.js .
- Довідку щодо роботи з Fetch API у JavaScript див Веб-документи MDN щодо Fetch API .
- Дізнайтеся, як використовувати API Swiggy для даних ресторану в офіційній документації API: API Swiggy .