Xử lý lỗi API trong React: Thử thách plugin CORS
Khi làm việc với API trong ReactJS, các nhà phát triển thường gặp phải nhiều thách thức khác nhau liên quan đến việc tìm nạp dữ liệu, đặc biệt là khi xử lý API của bên thứ ba. Một vấn đề phổ biến phát sinh là lỗi "Từ chối chưa được xử lý (TypeError): Không tìm nạp được". Lỗi này có thể xảy ra ngay cả khi sử dụng các API phổ biến như API danh sách nhà hàng của Swiggy, API mà nhiều nhà phát triển sử dụng để nâng cao ứng dụng web của họ.
Trong trường hợp này, việc thêm tiện ích mở rộng CORS Chrome có vẻ như là một giải pháp khả thi để vượt qua các chính sách hạn chế của trình duyệt. Tuy nhiên, nó có thể gây ra những biến chứng mới thay vì giải quyết được vấn đề. Nếu bạn đang sử dụng plugin CORS trong môi trường phát triển và các yêu cầu API của bạn không thành công ngay sau khi tải, thì bạn có thể gặp phải sự cố trong đó plugin xung đột với hành vi xử lý yêu cầu của trình duyệt.
Hiểu cách quản lý các yêu cầu có nguồn gốc chéo và khắc phục sự cố lỗi CORS trong ReactJS là điều cần thiết để quá trình phát triển diễn ra suôn sẻ. Các API như Swiggy thường có các lớp bảo mật, chẳng hạn như CORS, để kiểm soát quyền truy cập từ các máy khách trái phép. Những hạn chế này có thể dẫn đến những lỗi cần được giải quyết đúng cách.
Trong hướng dẫn này, chúng tôi sẽ tìm hiểu lý do tại sao lỗi này xảy ra, đặc biệt là sau khi thêm plugin CORS trong Chrome. Chúng ta cũng sẽ thảo luận các chiến lược để giải quyết vấn đề này khi làm việc với API Swiggy trong Phản ứng ứng dụng.
Yêu cầu | Ví dụ về sử dụng |
---|---|
fetch() | Lệnh này được sử dụng để thực hiện các yêu cầu HTTP tới API Swiggy. Nó tìm nạp tài nguyên không đồng bộ và trả về một lời hứa, lời hứa này sẽ phân giải thành đối tượng Phản hồi. Đây là chìa khóa để lấy dữ liệu nhà hàng từ API. |
useEffect() | Được sử dụng trong React, hook này cho phép thực thi các tác dụng phụ như lệnh gọi API sau khi kết xuất thành phần. Nó đảm bảo rằng yêu cầu tìm nạp tới API của Swiggy được thực hiện sau khi thành phần được gắn kết. |
res.setHeader() | Lệnh Express này đặt các tiêu đề HTTP tùy chỉnh, chẳng hạn như Kiểm soát truy cập-Cho phép-Xuất xứ, điều này rất quan trọng trong việc xử lý CORS. Nó cho phép phần phụ trợ cho phép các yêu cầu từ bất kỳ nguồn gốc nào, ngăn ngừa lỗi CORS. |
res.json() | Phương thức này được sử dụng để gửi phản hồi JSON trở lại máy khách. Trong giải pháp máy chủ proxy, nó đảm bảo dữ liệu API được tìm nạp từ Swiggy được trả về dưới dạng định dạng JSON mà giao diện người dùng có thể dễ dàng sử dụng. |
await | Từ khóa này tạm dừng việc thực thi chức năng không đồng bộ cho đến khi thao tác tìm nạp được giải quyết, đảm bảo mã chờ dữ liệu của API trước khi tiếp tục, ngăn chặn việc từ chối không được xử lý. |
express() | các thể hiện() được sử dụng để tạo một phiên bản của máy chủ Express. Máy chủ này hoạt động như một proxy giữa giao diện người dùng và API Swiggy để ngăn chặn các sự cố CORS trong quá trình tìm nạp dữ liệu. |
app.listen() | Lệnh này làm cho máy chủ Express bắt đầu lắng nghe các yêu cầu đến trên một cổng được chỉ định (ví dụ: cổng 5000 trong trường hợp này). Điều quan trọng là lưu trữ máy chủ proxy cục bộ trong quá trình phát triển. |
try...catch | Khối này xử lý các lỗi có thể xảy ra trong quá trình yêu cầu tìm nạp, chẳng hạn như lỗi mạng hoặc sự cố với API Swiggy. Nó đảm bảo rằng ứng dụng xử lý lỗi một cách khéo léo thay vì gặp sự cố. |
Giải thích các giải pháp cho các vấn đề CORS trong React với API Swiggy
Trong giải pháp đầu tiên, chúng tôi đã tạo một Node.js phụ trợ bằng Express để khắc phục sự cố CORS khi tìm nạp dữ liệu nhà hàng từ API của Swiggy. Chính sách CORS ngăn trình duyệt gửi yêu cầu đến một miền khác trừ khi miền đó cho phép. Bằng cách tạo một máy chủ đơn giản, chúng ta có thể hoạt động như một lớp trung gian giữa máy khách và API, tìm nạp dữ liệu phía máy chủ và trả nó về giao diện người dùng React. Phương pháp này tránh được lỗi CORS vì yêu cầu có cùng nguồn gốc với ứng dụng khách.
Phần phụ trợ Express thiết lập các tiêu đề tùy chỉnh, đặc biệt là Kiểm soát truy cập-Cho phép-Xuất xứ, cho phép khách hàng của chúng tôi yêu cầu tài nguyên mà không gặp phải các hạn chế của CORS. Lệnh gọi tìm nạp tới API của Swiggy được thực hiện phía máy chủ và dữ liệu được trả về ở định dạng JSON. Cách tiếp cận này thường được coi là an toàn và hiệu quả hơn trong môi trường sản xuất vì nó ẩn các khóa API hoặc thông tin nhạy cảm. Hơn nữa, việc sử dụng try-catch đảm bảo xử lý lỗi thích hợp, hiển thị thông báo lỗi thân thiện với người dùng nếu API không phản hồi.
Trong giải pháp thứ hai, chúng tôi sửa đổi yêu cầu tìm nạp trên mã React phía máy khách. Phương pháp này bao gồm việc thêm các tiêu đề tùy chỉnh trong lệnh gọi tìm nạp, đảm bảo rằng yêu cầu được định dạng chính xác trước khi tiếp cận API. Chúng tôi sử dụng React sử dụngHiệu ứng hook để kích hoạt lệnh gọi API khi thành phần được gắn kết. Hàm async chờ phản hồi API, chuyển đổi nó thành JSON và xử lý lỗi nếu yêu cầu không thành công. Tuy nhiên, giải pháp này vẫn gặp phải vấn đề CORS nếu API không cho phép trực tiếp các yêu cầu có nguồn gốc chéo từ trình duyệt.
Cuối cùng, trong giải pháp thứ ba, chúng tôi sử dụng dịch vụ của bên thứ ba có tên CORS-Anywhere. Đây là dịch vụ phần mềm trung gian tạm thời giúp vượt qua các hạn chế của CORS bằng cách định tuyến lại yêu cầu API thông qua máy chủ của họ. Mặc dù giải pháp này có thể hoạt động trong môi trường phát triển nhưng nó không được khuyến khích sử dụng trong môi trường sản xuất do rủi ro bảo mật và sự phụ thuộc vào các dịch vụ bên ngoài. Nó cũng gây ra chi phí về hiệu suất vì nó thêm một lớp bổ sung vào quá trình tìm nạp dữ liệu. Sử dụng phương pháp này có thể thuận tiện trong giai đoạn thử nghiệm nhưng nên tránh sử dụng trong sản xuất vì lý do bảo mật.
Giải pháp 1: Xử lý sự cố CORS với máy chủ proxy
Giải pháp này sử dụng máy chủ proxy phụ trợ Node.js để tránh lỗi CORS và tìm nạp dữ liệu chính xác từ API 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}`);
});
Giải pháp 2: Sử dụng Tìm nạp Front-End với Tiêu đề tùy chỉnh và Xử lý lỗi
Cách tiếp cận này sửa đổi yêu cầu tìm nạp trực tiếp trong React, thêm tiêu đề tùy chỉnh và xử lý lỗi một cách hiệu quả.
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;
Giải pháp 3: Sử dụng Middleware CORS-Anywhere để phát triển
Phương pháp này sử dụng dịch vụ "CORS-Anywhere" để vượt qua các hạn chế của CORS khi ở chế độ phát triển. Giải pháp này không nên được sử dụng trong sản xuất.
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;
Khắc phục sự cố CORS trong yêu cầu API
Một trong những lý do cơ bản gây ra lỗi "Không tìm nạp được" trong ứng dụng React, đặc biệt là khi sử dụng API của bên thứ ba như Swiggy, là CORS (Chia sẻ tài nguyên chéo nguồn gốc). CORS là một tính năng bảo mật hạn chế các ứng dụng web gửi yêu cầu đến một miền khác với miền mà chúng được phục vụ. Trong trường hợp này, API Swiggy từ chối yêu cầu vì nó bắt nguồn từ một miền khác (ứng dụng React của bạn). Điều này đặc biệt có vấn đề khi bạn tìm nạp dữ liệu từ các API không hỗ trợ rõ ràng các yêu cầu có nguồn gốc chéo.
Một cách giải quyết phổ biến là sử dụng các tiện ích mở rộng của trình duyệt như tiện ích mở rộng Chrome "Cho phép CORS". Tuy nhiên, những phần mở rộng như vậy có thể dẫn đến kết quả không nhất quán. Điều này là do chúng thao túng các cài đặt cấp trình duyệt không phải lúc nào cũng đồng bộ hóa đúng cách với các yêu cầu API. Những plugin này lý tưởng nhất chỉ nên được sử dụng để phát triển chứ không phải trong môi trường sản xuất. Đối với sản xuất, cách tiếp cận an toàn và đáng tin cậy hơn sẽ là sử dụng máy chủ proxy phụ trợ yêu cầu dữ liệu thay mặt cho ứng dụng React của bạn, như đã thấy trong các giải pháp được cung cấp trước đó.
Một khía cạnh khác cần xem xét là xử lý lỗi một cách hiệu quả. Mặc dù sự cố CORS là nguyên nhân phổ biến gây ra lỗi "Không thể tìm nạp", nhưng các yếu tố khác như mạng không ổn định, URL API không chính xác hoặc thời gian ngừng hoạt động của máy chủ cũng có thể dẫn đến lỗi này. Do đó, điều quan trọng là phải thực hiện xử lý lỗi mạnh mẽ trong mã của bạn, đặc biệt là khi làm việc với API của bên thứ ba. Cơ chế xử lý lỗi phù hợp sẽ giúp gỡ lỗi vấn đề hiệu quả hơn và cung cấp các thông báo thân thiện với người dùng khi có sự cố.
Các câu hỏi thường gặp về CORS và các yêu cầu API trong React
- CORS là gì và tại sao nó quan trọng?
- CORS (Chia sẻ tài nguyên nguồn gốc chéo) là một chính sách bảo mật được các trình duyệt thực thi để ngăn chặn các yêu cầu độc hại từ các miền không đáng tin cậy. Nó đảm bảo rằng chỉ một số miền nhất định mới được phép lấy tài nguyên từ máy chủ.
- Tại sao tôi nhận được thông báo "Từ chối chưa được xử lý (Lỗi Loại): Không tìm nạp được"?
- Lỗi này thường xảy ra khi yêu cầu API của bạn bị chặn do hạn chế CORS. Nguyên nhân cũng có thể là do URL API không chính xác hoặc do sự cố với máy chủ.
- cái gì làm useEffect hook làm gì trong bối cảnh này?
- các useEffect hook trong React được sử dụng để kích hoạt yêu cầu API sau khi thành phần được gắn kết. Nó đảm bảo rằng hoạt động tìm nạp diễn ra vào đúng thời điểm, ngăn chặn nhiều yêu cầu không cần thiết.
- Làm cách nào để sửa lỗi CORS trong ứng dụng React?
- Để sửa lỗi CORS, bạn có thể sử dụng proxy phụ trợ, đặt tiêu đề phù hợp với res.setHeader trong máy chủ hoặc dựa vào các dịch vụ như CORS-Anywhere cho mục đích phát triển.
- Tôi có thể sử dụng tiện ích mở rộng trình duyệt CORS trong sản xuất không?
- Không, tiện ích mở rộng trình duyệt CORS chỉ nên được sử dụng để phát triển. Trong quá trình sản xuất, việc định cấu hình CORS trên máy chủ hoặc sử dụng máy chủ proxy sẽ an toàn hơn.
Suy nghĩ cuối cùng về việc quản lý lỗi CORS trong React
Lỗi CORS là một thách thức phổ biến khi phát triển ứng dụng React sử dụng API của bên thứ ba. Mặc dù tiện ích mở rộng trình duyệt có thể hỗ trợ phát triển nhưng điều quan trọng là phải triển khai các giải pháp đáng tin cậy hơn như máy chủ proxy trong môi trường sản xuất để duy trì tính bảo mật và tính toàn vẹn dữ liệu.
Bằng cách sử dụng các kỹ thuật phù hợp, chẳng hạn như giải pháp xử lý lỗi và phụ trợ, nhà phát triển có thể xử lý các vấn đề như "Không tìm nạp được" một cách hiệu quả. Điều này đảm bảo rằng ứng dụng của họ mang lại trải nghiệm người dùng mượt mà khi tương tác với API, nâng cao hiệu suất và chức năng.
Tài liệu tham khảo và nguồn tài liệu để hiểu các vấn đề CORS trong React
- Để biết thông tin chi tiết về Chia sẻ tài nguyên nguồn gốc chéo (CORS) và cách quản lý nó trong React, hãy tham khảo Tài liệu web MDN trên CORS .
- Để hiểu thêm về các lỗi React phổ biến như "Không tìm nạp được" và các giải pháp tiềm năng, hãy kiểm tra Tài liệu phản ứng về ranh giới lỗi .
- Nếu bạn đang làm việc với Express để thiết lập máy chủ proxy nhằm khắc phục sự cố CORS, hãy truy cập Định tuyến và phần mềm trung gian Express.js .
- Để được trợ giúp về cách làm việc với API tìm nạp trong JavaScript, hãy xem Tài liệu web MDN trên API tìm nạp .
- Khám phá cách sử dụng API của Swiggy cho dữ liệu nhà hàng trong tài liệu API chính thức: API Swiggy .