Mengendalikan Ralat API dalam React: CORS Plugin Challenges
Apabila bekerja dengan API dalam ReactJS, pembangun sering menghadapi pelbagai cabaran yang berkaitan dengan pengambilan data, terutamanya apabila berurusan dengan API pihak ketiga. Satu isu biasa yang timbul ialah ralat "Penolakan Tidak Terkendali (TypeError): Gagal mengambil". Ralat ini boleh berlaku walaupun semasa menggunakan API popular seperti API senarai restoran Swiggy, yang digunakan oleh ramai pembangun untuk meningkatkan aplikasi web mereka.
Dalam kes ini, menambah sambungan Chrome CORS mungkin kelihatan seperti penyelesaian yang berdaya maju untuk memintas dasar penyemak imbas yang terhad. Walau bagaimanapun, ia mungkin memperkenalkan komplikasi baharu dan bukannya menyelesaikan isu tersebut. Jika anda menggunakan pemalam CORS dalam persekitaran pembangunan anda, dan permintaan API anda gagal sejurus selepas dimuatkan, anda mungkin menghadapi masalah apabila pemalam itu bercanggah dengan gelagat pengendalian permintaan penyemak imbas.
Memahami cara mengurus permintaan silang asal dan menyelesaikan masalah ralat CORS dalam ReactJS adalah penting untuk proses pembangunan yang lancar. API seperti Swiggy selalunya mempunyai lapisan keselamatan, seperti CORS, untuk mengawal akses daripada pelanggan yang tidak dibenarkan. Sekatan ini boleh menyebabkan ralat yang perlu ditangani dengan betul.
Dalam panduan ini, kami akan meneroka sebab ralat ini berlaku, terutamanya selepas menambah pemalam CORS dalam Chrome. Kami juga akan membincangkan strategi untuk menyelesaikannya semasa bekerja dengan Swiggy API dalam anda Bertindak balas aplikasi.
Perintah | Contoh penggunaan |
---|---|
fetch() | Perintah ini digunakan untuk membuat permintaan HTTP kepada Swiggy API. Ia mengambil sumber secara tidak segerak dan mengembalikan janji, yang diselesaikan kepada objek Respons. Ia adalah kunci untuk mendapatkan semula data restoran daripada API. |
useEffect() | Digunakan dalam React, cangkuk ini membenarkan pelaksanaan kesan sampingan seperti panggilan API selepas memaparkan komponen. Ia memastikan bahawa permintaan pengambilan kepada Swiggy's API dibuat sebaik sahaja komponen itu dipasang. |
res.setHeader() | Perintah Express ini menetapkan pengepala HTTP tersuai, seperti Access-Control-Allow-Origin, yang penting dalam pengendalian CORS. Ia membolehkan bahagian belakang membenarkan permintaan dari mana-mana asal, menghalang ralat CORS. |
res.json() | Kaedah ini digunakan untuk menghantar semula respons JSON kepada klien. Dalam penyelesaian pelayan proksi, ia memastikan data API yang diambil daripada Swiggy dikembalikan sebagai format JSON, yang boleh digunakan oleh bahagian hadapan dengan mudah. |
await | Kata kunci ini menjeda pelaksanaan fungsi tak segerak sehingga operasi pengambilan diselesaikan, memastikan kod menunggu data API sebelum meneruskan, menghalang penolakan yang tidak dikendalikan. |
express() | The ekspres() fungsi digunakan untuk mencipta contoh pelayan Express. Pelayan ini bertindak sebagai proksi antara bahagian hadapan dan API Swiggy untuk mengelakkan isu CORS semasa pengambilan data. |
app.listen() | Perintah ini membuatkan pelayan Express mula mendengar permintaan masuk pada port tertentu (cth., port 5000 dalam kes ini). Ia adalah penting untuk mengehoskan pelayan proksi secara tempatan semasa pembangunan. |
try...catch | Blok ini mengendalikan ralat yang mungkin berlaku semasa permintaan pengambilan, seperti kegagalan rangkaian atau isu dengan API Swiggy. Ia memastikan bahawa apl mengendalikan ralat dengan anggun dan bukannya ranap. |
Menjelaskan Penyelesaian untuk Isu CORS dalam React dengan Swiggy API
Dalam penyelesaian pertama, kami mencipta a Node.js bahagian belakang menggunakan Express untuk memintas isu CORS apabila mengambil data restoran daripada API Swiggy. Dasar CORS menghalang penyemak imbas daripada membuat permintaan kepada domain lain melainkan domain itu membenarkannya. Dengan mencipta pelayan ringkas, kami boleh bertindak sebagai lapisan tengah antara klien dan API, mengambil bahagian pelayan data dan mengembalikannya ke bahagian hadapan React. Kaedah ini mengelakkan ralat CORS kerana permintaan datang dari asal yang sama dengan apl klien.
Bahagian belakang Express menyediakan pengepala tersuai, terutamanya Access-Control-Allow-Origin, yang membolehkan pelanggan kami meminta sumber tanpa menghadapi sekatan CORS. Panggilan ambil ke API Swiggy dibuat di sebelah pelayan dan data dikembalikan dalam format JSON. Pendekatan ini selalunya dianggap lebih selamat dan berprestasi dalam persekitaran pengeluaran kerana ia menyembunyikan kunci API atau maklumat sensitif. Tambahan pula, penggunaan try-catch memastikan pengendalian ralat yang betul, memaparkan mesej ralat mesra pengguna jika API gagal bertindak balas.
Dalam penyelesaian kedua, kami mengubah suai permintaan pengambilan pada kod React sisi klien. Kaedah ini melibatkan penambahan pengepala tersuai dalam panggilan pengambilan, memastikan permintaan diformatkan dengan betul sebelum mencapai API. Kami menggunakan React's useEffect cangkuk untuk mencetuskan panggilan API apabila komponen dipasang. Fungsi async menunggu respons API, menukarnya kepada JSON dan mengendalikan ralat jika permintaan gagal. Walau bagaimanapun, penyelesaian ini masih menghadapi isu CORS jika API tidak membenarkan permintaan silang asal daripada penyemak imbas secara langsung.
Akhir sekali, dalam penyelesaian ketiga, kami menggunakan perkhidmatan pihak ketiga yang dipanggil CORS-Anywhere. Ini ialah perkhidmatan middleware yang membantu memintas sekatan CORS buat sementara waktu dengan mengubah hala permintaan API melalui pelayan mereka. Walaupun penyelesaian ini boleh berfungsi dalam persekitaran pembangunan, ia tidak disyorkan untuk pengeluaran kerana risiko keselamatan dan pergantungan pada perkhidmatan luaran. Ia juga memperkenalkan overhed prestasi kerana ia menambah lapisan tambahan pada proses pengambilan data. Menggunakan kaedah ini boleh menjadi mudah semasa fasa ujian tetapi harus dielakkan dalam pengeluaran atas sebab keselamatan.
Penyelesaian 1: Mengendalikan Isu CORS dengan Pelayan Proksi
Penyelesaian ini menggunakan pelayan proksi bahagian belakang Node.js untuk mengelakkan ralat CORS dan mengambil data dengan betul daripada 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}`);
});
Penyelesaian 2: Menggunakan Pengambilan Bahagian Depan dengan Pengepala Tersuai dan Pengendalian Ralat
Pendekatan ini mengubah suai permintaan pengambilan secara langsung dalam React, menambahkan pengepala tersuai dan mengendalikan ralat dengan berkesan.
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;
Penyelesaian 3: Menggunakan Perisian Tengah CORS-Anywhere untuk Pembangunan
Kaedah ini menggunakan perkhidmatan "CORS-Anywhere" untuk memintas sekatan CORS semasa dalam mod pembangunan. Penyelesaian ini tidak boleh digunakan dalam pengeluaran.
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;
Menyelesaikan masalah Isu CORS dalam Permintaan API
Salah satu sebab asas ralat "Gagal untuk mengambil" dalam aplikasi React, terutamanya apabila menggunakan API pihak ketiga seperti Swiggy, ialah CORS (Perkongsian Sumber Silang Asal) sekatan. CORS ialah ciri keselamatan yang mengehadkan aplikasi web daripada membuat permintaan ke domain yang berbeza daripada domain yang digunakan. Dalam kes ini, Swiggy API menolak permintaan kerana ia berasal daripada domain yang berbeza (apl React anda). Ini amat bermasalah apabila anda mengambil data daripada API yang tidak menyokong permintaan silang asal secara eksplisit.
Penyelesaian biasa ialah menggunakan sambungan penyemak imbas seperti sambungan Chrome "Benarkan CORS". Walau bagaimanapun, sambungan sedemikian boleh membawa kepada hasil yang tidak konsisten. Ini kerana mereka memanipulasi tetapan peringkat penyemak imbas yang tidak sentiasa disegerakkan dengan betul dengan permintaan API. Pemalam ini sepatutnya digunakan hanya untuk pembangunan dan bukan dalam persekitaran pengeluaran. Untuk pengeluaran, pendekatan yang lebih selamat dan lebih dipercayai akan menggunakan pelayan proksi bahagian belakang yang meminta data bagi pihak apl React anda, seperti yang dilihat dalam penyelesaian yang disediakan sebelum ini.
Satu lagi aspek yang perlu dipertimbangkan ialah mengendalikan ralat dengan berkesan. Walaupun isu CORS adalah punca biasa ralat "Gagal mengambil", faktor lain seperti ketidakstabilan rangkaian, URL API yang salah atau masa henti pelayan juga boleh mengakibatkan ralat ini. Oleh itu, penting untuk dilaksanakan pengendalian ralat yang mantap dalam kod anda, terutamanya apabila bekerja dengan API pihak ketiga. Mekanisme pengendalian ralat yang betul akan membantu menyahpepijat isu dengan lebih berkesan dan menyediakan mesej mesra pengguna apabila berlaku masalah.
Soalan Lazim Mengenai CORS dan Permintaan API dalam React
- Apakah CORS dan mengapa ia penting?
- CORS (Cross-Origin Resource Sharing) ialah dasar keselamatan yang dikuatkuasakan oleh penyemak imbas untuk menghalang permintaan hasad daripada domain yang tidak dipercayai. Ia memastikan bahawa hanya domain tertentu dibenarkan untuk mengambil sumber daripada pelayan.
- Mengapa saya mendapat "Penolakan Tidak Terkendali (TypeError): Gagal diambil"?
- Ralat ini biasanya berlaku apabila permintaan API anda disekat disebabkan oleh sekatan CORS. Ia juga mungkin disebabkan oleh URL API yang salah atau isu dengan pelayan.
- Apa yang useEffect cangkuk lakukan dalam konteks ini?
- The useEffect cangkuk dalam React digunakan untuk mencetuskan permintaan API selepas komponen dipasang. Ia memastikan bahawa operasi pengambilan berlaku pada masa yang tepat, menghalang berbilang permintaan yang tidak perlu.
- Bagaimanakah saya boleh membetulkan ralat CORS dalam aplikasi React?
- Untuk membetulkan ralat CORS, anda boleh menggunakan proksi hujung belakang, tetapkan pengepala yang betul dengan res.setHeader dalam pelayan, atau bergantung pada perkhidmatan seperti CORS-Anywhere untuk tujuan pembangunan.
- Bolehkah saya menggunakan sambungan penyemak imbas CORS dalam pengeluaran?
- Tidak, sambungan penyemak imbas CORS hanya boleh digunakan untuk pembangunan. Dalam pengeluaran, adalah lebih selamat untuk mengkonfigurasi CORS pada pelayan atau menggunakan pelayan proksi.
Pemikiran Akhir tentang Mengurus Ralat CORS dalam Reaksi
Ralat CORS ialah cabaran biasa apabila membangunkan aplikasi React yang menggunakan API pihak ketiga. Walaupun sambungan penyemak imbas boleh membantu dalam pembangunan, adalah penting untuk melaksanakan penyelesaian yang lebih dipercayai seperti pelayan proksi dalam persekitaran pengeluaran untuk mengekalkan keselamatan dan integriti data.
Dengan menggunakan teknik yang betul, seperti pengendalian ralat dan penyelesaian bahagian belakang, pembangun boleh menangani isu seperti "Gagal diambil." Ini memastikan aplikasi mereka menyediakan pengalaman pengguna yang lancar apabila berinteraksi dengan API, meningkatkan prestasi dan kefungsian.
Rujukan dan Bahan Sumber untuk Memahami Isu CORS dalam React
- Untuk maklumat terperinci tentang Perkongsian Sumber Silang Asal (CORS) dan cara mengurusnya dalam React, rujuk Dokumen Web MDN pada CORS .
- Untuk memahami lebih lanjut tentang ralat React biasa seperti "Gagal diambil" dan kemungkinan penyelesaian, semak React Dokumentasi pada Ralat Sempadan .
- Jika anda bekerja dengan Express untuk menyediakan pelayan proksi untuk memintas isu CORS, lawati Penghalaan Express.js dan Middleware .
- Untuk mendapatkan bantuan tentang cara bekerja dengan API Ambil dalam JavaScript, lihat MDN Web Docs on Fetch API .
- Terokai cara menggunakan API Swiggy untuk data restoran dalam dokumentasi API rasmi: API Swiggy .