Panduan Penanganan Pengecualian dalam Kecerdasan Data PlatoBlockchain Ekspres. Pencarian Vertikal. Ai.

Panduan Penanganan Pengecualian di Express

Pengantar

Pengecualian dan kesalahan pasti akan terjadi saat pengguna berinteraksi dengan aplikasi apa pun, terserah insinyur perangkat lunak untuk memilih cara untuk menangani kesalahan apa pun yang mungkin timbul – secara sadar atau tidak sadar. Akibatnya, pengembang backend yang membangun API dengan Express mendapati diri mereka bekerja untuk memastikan bahwa mereka membangun API yang bermanfaat, efisien, dan dapat digunakan. Yang paling penting adalah menangani kesalahan sedemikian rupa untuk membangun sistem yang kuat karena ini membantu mengurangi waktu pengembangan, kesalahan langsung, masalah produktivitas, dan menentukan keberhasilan atau skalabilitas pengembangan perangkat lunak.

Apakah Anda perlu mencatat pesan kesalahan, menekan kesalahan, memberi tahu pengguna tentang kesalahan, atau menulis kode untuk menangani kesalahan? Tidak heran lagi.

Dalam panduan ini, kita akan mempelajari cara membuat basis kode penanganan kesalahan yang tangguh untuk aplikasi Express, yang akan membantu mendeteksi kesalahan aplikasi dan mengambil tindakan optimal untuk memulihkan aplikasi apa pun dari kegagalan yang mulus selama runtime.

Catatan: Kami akan menggunakan Postman untuk menguji API di demo kami. Anda dapat mendownloadnya di Halaman Unduh tukang pos. Atau, Anda cukup menggunakan browser, baris perintah curl alat, atau alat lain yang mungkin Anda kenal.

Apa itu Penanganan Kesalahan?

Dalam pengembangan perangkat lunak, ada dua jenis pengecualian: operasional dan terprogram.

  • Kegagalan operasional mungkin muncul selama runtime, dan untuk mencegah aplikasi berhenti tiba-tiba, kita harus menangani pengecualian ini dengan baik melalui metode penanganan kesalahan yang efisien.
  • Pengecualian terprogram dilemparkan secara manual oleh seorang programmer, ketika keadaan luar biasa muncul.

Anda dapat menganggap pengecualian operasional sebagai pengecualian "tak terduga, tetapi diperkirakan" (seperti mengakses indeks di luar batas), dan pengecualian terprogram sebagai pengecualian "diharapkan dan diperkirakan" (seperti pengecualian pemformatan angka).

Penanganan pengecualian adalah prosedur yang digunakan untuk menemukan dan memperbaiki kekurangan dalam suatu program. Penanganan kesalahan mengirimkan pesan yang menyertakan jenis kesalahan yang terjadi dan tumpukan tempat terjadinya kesalahan.

Catatan: Dalam ilmu komputer, pengecualian dapat dipulihkan dari, dan biasanya berasal dari masalah operasional atau program selama runtime. Kesalahan biasanya muncul dari faktor eksternal, seperti keterbatasan perangkat keras, masalah konektivitas, kekurangan memori, dll. Dalam JavaScript, istilah tersebut sering digunakan secara bergantian, dan pengecualian khusus berasal dari Error kelas. Itu Error kelas itu sendiri mewakili kesalahan dan pengecualian.

Di Express, penanganan pengecualian mengacu pada bagaimana Express mengatur dirinya sendiri untuk menangkap dan memproses pengecualian sinkron dan asinkron. Hal yang baik tentang penanganan pengecualian di Express adalah sebagai pengembang, Anda tidak perlu menulis penangan pengecualian Anda sendiri; Express hadir dengan penangan pengecualian default. Penangan pengecualian membantu dalam mengidentifikasi kesalahan dan melaporkannya kepada pengguna. Ini juga menyediakan berbagai strategi perbaikan dan mengimplementasikannya untuk mengurangi pengecualian.

Meskipun ini mungkin tampak seperti banyak hal yang tersembunyi, penanganan pengecualian di Express tidak memperlambat keseluruhan proses program atau menghentikan eksekusinya.

Memahami Penanganan Pengecualian di Express

Dengan penangan kesalahan default yang disertakan dengan Express, kami memiliki serangkaian fungsi middleware yang membantu menangkap kesalahan dalam penangan rute secara otomatis. Segera, kami akan membuat proyek untuk mempraktikkan teori tentang cara mengembalikan kesalahan yang tepat di aplikasi Express dan cara tidak membocorkan informasi sensitif.

Mendefinisikan fungsi middleware di Express

Fungsi middleware penanganan kesalahan didefinisikan sedemikian rupa sehingga mereka menerima Error objek sebagai parameter input pertama, diikuti oleh parameter default dari fungsi middleware lainnya: request, response, dan next. itu next() fungsi melewatkan semua middleware saat ini ke penangan kesalahan berikutnya untuk router.

Menyiapkan Penanganan Kesalahan di Express

Jalankan perintah berikut di terminal Anda untuk membuat aplikasi Node dan Express:

$ mkdir error-handling-express

Di folder yang baru dibuat, mari menginisialisasi proyek Node baru:

$ cd error-handling-express && npm init -y

Ini menciptakan a package.json file di folder kita.

Untuk membuat server Express di aplikasi Node kami, kami harus menginstal express paket, dotenv untuk secara otomatis memuat variabel lingkungan ke dalam .env file ke dalam process.env objek, dan nodemon untuk memulai ulang aplikasi node jika perubahan file dicatat di direktori.

$ npm install express dotenv nodemon

Selanjutnya, buat sebuah app.js file di folder proyek yang akan berfungsi sebagai file indeks untuk aplikasi.

Sekarang setelah kami menginstal semua dependensi yang diperlukan untuk aplikasi Express kami, kami perlu menyiapkan skrip untuk membaca aplikasi di package.json mengajukan. Untuk mencapai itu, the package.json file, sehingga scripts objek seperti yang ditunjukkan di bawah ini:

"scripts": {
    "start": "nodemon app.js"
},

Alternatifnya, Anda dapat melewati penggunaan nodemon, dan gunakan node app.js sebagai gantinya.

Menyiapkan server Ekspres

Untuk menyiapkan server, pertama-tama kita harus mengimpor berbagai paket ke dalamnya app.js. Kami juga akan membuat .env file di direktori proyek – untuk menyimpan semua variabel lingkungan untuk aplikasi:



const express = require('express')
require('dotenv').config

PORT=4000 

Kami telah menentukan nomor port untuk aplikasi .env, yang dimuat dan dibaca oleh dotenv, dan dapat diakses nanti.

Menginisialisasi Express Server

Sekarang, kita perlu menginisialisasi server Express dan membuat aplikasi kita mendengarkan nomor port aplikasi, bersama dengan permintaan ke rute pengujian – /test. Mari perbarui app.js, di bawah pernyataan impor:


const app = express();
const port = process.env.PORT || 4000;

app.get("/test", async (req, res) => {
    return res.status(200).json({ success: true });
});

app.listen(port, () => {
    console.log(`Server is running at port ${port}`);
});

Mulai sekarang, kita akan mempelajari cara menangani berbagai kasus penggunaan kesalahan operasional yang dapat ditemui di Express.

Menangani Kesalahan Tidak Ditemukan di Express

Misalkan Anda perlu mengambil semua pengguna dari database pengguna, Anda dapat secara efisien menangani skenario kesalahan potensial di mana tidak ada data dalam database, dengan membungkus logika menjadi try/catch blok – berharap menemukan kesalahan apa pun yang dapat diproyeksikan di catch blok:


const getUser = () => undefined;

app.get("/get-user", async (req, res) => {
	try {
		const user = getUser();
		if (!user) {
			throw new Error('User not found');
		}
	} catch (error) {
	    
		console.log(error); 
		
		res.status(400).send(error.message) 
	}
	return res.status(200).json({
		success: true
	});
});

Ini menghasilkan:

User not found

Sekarang, ketika permintaan ini dibuat (Anda dapat menguji menggunakan Postman) dan tidak ada pengguna di database, klien menerima pesan kesalahan yang mengatakan "Pengguna tidak ditemukan". Juga, Anda akan melihat bahwa kesalahan juga dicatat di konsol.

Mengoptimalkan Penanganan Error dengan Error Handler Middleware

Kami dapat mengoptimalkan pengembangan dengan membuat middleware penangan kesalahan yang akan muncul di akhir semua rute yang ditentukan, sehingga jika terjadi kesalahan di salah satu rute, Express akan secara otomatis melihat middleware berikutnya dan terus menelusuri daftar hingga mencapai penangan kesalahan. Penangan kesalahan akan memproses kesalahan dan juga mengirimkan kembali respons ke klien.

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

Untuk memulai, buat folder bernama middleware di direktori proyek, dan di folder ini, buat file bernama errorHandler.js yang mendefinisikan penangan kesalahan:

const errorHandler = (error, req, res, next) => {
    
    console.log(error); 
    
    res.status(400).send(error.message); 
}
module.exports = errorHandler;

Dalam fungsi middleware kami, kami telah membuat Express menyadari bahwa ini bukan fungsi middleware dasar, tetapi penangan kesalahan, dengan menambahkan error parameter sebelum 3 parameter dasar.

Sekarang, kami akan menggunakan penangan kesalahan dalam demo kami app.js dan tangani kesalahan awal saat mengambil pengguna dengan middleware penangan kesalahan, seperti yang ditunjukkan di bawah ini:


const getUser = () => undefined;

app.get("/get-user", async (req, res, next) => {
	try {
		const user = getUser();
		if (!user) {
			throw new Error("User not found");
		}
	} catch (error) {
		return next(error);
	}
});

app.use(errorHandler);

Kami dapat lebih mengoptimalkan kode kami, dengan membuat abtsraction di sekitar try/catch logika. Kita dapat mencapainya dengan membuat folder baru di direktori proyek bernama utils, dan di dalamnya, buat file bernama tryCatch.js.

Untuk abstrak try-catch logika – kita dapat mendefinisikan fungsi yang menerima fungsi lain (dikenal sebagai pengawas) sebagai parameternya, dan mengembalikan an async fungsi yang akan mengadakan a try/catch untuk setiap pengontrol yang diterima.

Jika kesalahan terjadi pada pengontrol, itu ditangkap di catch blok dan fungsi selanjutnya disebut:


const tryCatch = (controller) => async (req, res, next) => {
	try {
		await controller(req, res);
	} catch (error) {
		return next(error);
	}
};
module.exports = tryCatch;

Dengan try/catch abstraksi, kita dapat memperbaiki kode kita agar lebih ringkas dengan melewatkan try-catch klausa secara eksplisit saat mengambil pengguna di app.js:


const getUser = () => undefined;

app.get(
	"/get-user",
	tryCatch(async (req, res) => {
		const user = getUser();
		if (!user) {
			throw new Error("User not found");
		}
		res.status(400).send(error.message);
	})
);

Kami telah berhasil mengabstraksi logika try-catch dan kode kami masih berfungsi seperti sebelumnya.

Menangani Error Validasi di Express

Untuk demo ini, kami akan membuat rute baru di aplikasi Express kami untuk login – untuk memvalidasi ID pengguna saat login. Pertama, kami akan menginstal joi paket, untuk membantu membuat skema, yang dengannya kami dapat menegakkan persyaratan:

$ npm i joi

Selanjutnya, buat skema yang merupakan a Joi.object dengan userId yang harus berupa angka dan wajib – artinya permintaan harus cocok dengan objek dengan ID pengguna di atasnya.

Kita bisa menggunakan validate() metode dalam objek skema untuk memvalidasi setiap masukan terhadap skema:


const schema = Joi.object({
	userId: Joi.number().required(),
});

app.post(
	"/login",
	tryCatch(async (req, res) => {
		const {error, value} = schema.validate({});
		if (error) throw error;
	})
);

Jika objek kosong diteruskan ke validate() metode, kesalahan akan ditangani dengan anggun, dan pesan kesalahan akan dikirim ke klien:

Di konsol, kami juga mendapatkan akses ke a details array yang mencakup berbagai detail tentang kesalahan yang dapat dikomunikasikan kepada pengguna jika perlu.

Untuk secara khusus menangani kesalahan validasi sedemikian rupa untuk meneruskan detail kesalahan yang sesuai per kesalahan validasi, middleware penangan kesalahan dapat di-refactored:


const errorHandler = (error, req, res, next) => {
	console.log(error); 

	if (error.name === "ValidationError") {
		return res.status(400).send({
			type: "ValidationError",
			details: error.details,
		});
	}

	res.status(400).send(error.message); 
};

module.exports = errorHandler;

Dengan errorHandler.js sekarang dikustomisasi, saat kami membuat permintaan yang sama dengan objek kosong yang diteruskan ke validate() Metode:

Panduan Penanganan Pengecualian dalam Kecerdasan Data PlatoBlockchain Ekspres. Pencarian Vertikal. Ai.

Kami sekarang memiliki akses ke objek yang disesuaikan yang mengembalikan pesan dengan cara yang lebih mudah dibaca/ramah. Dengan cara ini, kami dapat mengirim dan menangani berbagai jenis kesalahan berdasarkan jenis kesalahan yang masuk.

Kesimpulan

Dalam panduan ini, kita membahas setiap aspek penanganan kesalahan Express.js, termasuk bagaimana kode sinkron dan asinkron ditangani secara default, cara membuat kelas kesalahan Anda sendiri, cara menulis fungsi middleware penanganan kesalahan kustom, dan menyediakan next sebagai penangan tangkapan terakhir

Seperti setiap tugas di luar sana, ada juga praktik terbaik selama pengembangan yang mencakup penanganan kesalahan yang efektif, dan hari ini kami telah mempelajari cara menangani kesalahan dalam aplikasi Express dengan cara yang andal.

Menangani error dengan benar tidak hanya berarti mengurangi waktu pengembangan dengan menemukan bug dan error dengan mudah, tetapi juga mengembangkan basis kode yang kuat untuk aplikasi berskala besar. Dalam panduan ini, kita telah melihat cara menyiapkan middleware untuk menangani kesalahan operasional. Beberapa cara lain untuk meningkatkan penanganan kesalahan meliputi: tidak mengirim pelacakan tumpukan, menghentikan proses dengan baik untuk menangani pengecualian yang tidak tertangkap, memberikan pesan kesalahan yang sesuai, mengirim log kesalahan, dan menyiapkan kelas yang memperluas Error kelas.

Saya harap contoh yang saya gunakan dalam tutorial ini menyenangkan bagi Anda. Saya membahas berbagai skenario yang berpotensi Anda temui saat menulis aplikasi Express untuk digunakan di dunia nyata tentang manajemen kesalahan. Tolong, beri tahu saya jika ada sesuatu yang saya lewatkan. Ini akan menguntungkan kita dan membantu saya belajar lebih banyak juga. Semoga harimu menyenangkan dan terima kasih sudah membaca.

Anda dapat merujuk ke semua kode sumber yang digunakan dalam artikel di Github.

Sumber Tambahan

Stempel Waktu:

Lebih dari penyalahgunaan