Pengecualian yang tidak ditangani dapat menyebabkan kebingungan dan frustrasi. Bersihkan mereka dengan filter pengecualian.

Filter pengecualian Nest.js menyediakan cara untuk mencegat dan menangani pengecualian secara global atau per pengontrol.

Mereka memungkinkan Anda memusatkan logika penanganan kesalahan, memformat respons kesalahan, dan memberikan penanganan kesalahan yang konsisten di seluruh aplikasi Anda. Pelajari tentang filter pengecualian dan cara menggunakannya untuk menangani kesalahan aplikasi dengan tepat.

Penanganan Kesalahan Default di Nest.js

Secara default, Nest.js memiliki lapisan pengecualian yang menangani pengecualian apa pun yang tidak ditangani oleh kode aplikasi Anda.

Ketika kesalahan yang tidak tertangani terjadi di aplikasi Anda, Nest.js menangkapnya dan mengembalikan kesalahan server internal 500 ke klien. JSON yang dikembalikan Nest.js dalam kasus ini terlihat seperti ini:

{
"statusCode": 500,
"message": "Internal server error"
}

Jika objek kesalahan yang dimunculkan kode Anda berisi a

instagram viewer
Kode status dan sebuah pesan, Nest.js akan mengembalikan nilai tersebut, bukan respons default.

Untuk menghindari perilaku umum ini, dan mengirimkan respons kesalahan yang lebih bermakna kepada klien, Anda harus rajin menangani semua kesalahan yang mungkin terjadi pada aplikasi Anda. Anda dapat mencapai hal ini menggunakan filter pengecualian bawaan atau khusus Nest.js.

Membuat Filter Pengecualian Kustom

Untuk mendemonstrasikan proses pembuatan filter pengecualian khusus, coba buat filter yang akan menangani semua pengecualian HTTP.

Mulailah dengan file bernama http.pengecualian.ts dan tambahkan impor berikut ke dalamnya:

import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from'@nestjs/common';

import { Request, Response } from'express';

Impor ini memiliki tujuan sebagai berikut.

  • Filter Pengecualian: Ini adalah antarmuka yang menjelaskan implementasi filter pengecualian.
  • Menangkap: Ini adalah dekorator yang menandai kelas sebagai filter pengecualian Nest.
  • ArgumenHost: Antarmuka ini menyediakan metode untuk mengambil argumen yang diteruskan ke pengendali. Ini memungkinkan Anda memilih konteks eksekusi yang sesuai (misalnya, HTTP, RPC, atau WebSockets) untuk mengambil argumen.
  • HttpException: Ini adalah kelas yang mendefinisikan pengecualian dasar Nest HTTP.
  • Meminta & Tanggapan: Ini adalah antarmuka untuk objek permintaan dan respons Express.js.

Selanjutnya, buat kelas, HttpExceptionFilter, yang mengimplementasikan Filter Pengecualian. Beri anotasi dengan Menangkap dekorator untuk menunjukkan bahwa ia menangani HttpExceptions:

@Catch(HttpException)
exportclassHttpExceptionFilterimplementsExceptionFilter{}

Selanjutnya, isi kelas dengan kode ini:

catch(exception: HttpException, host: ArgumentsHost) {
// Get the response object from the arguments host
const ctx = host.switchToHttp();
const response = ctx.getResponse();

// Get the request object from the arguments host
const request = ctx.getRequest();

// Get the status code from the exception
const status = exception.getStatus();

// Send a JSON response using the response object
response.status(status).json({
statusCode: status,
timestamp: newDate().toISOString(),
path: request.url,
message:
exception.message
|| exception.getResponse()['message']
|| 'Internal Server Error',
});
}

Blok kode ini mengambil objek permintaan dan respons dari objek ArgumentsHost dan mengekstrak informasi yang relevan dari pengecualian. Ini mengembalikan respons objek JSON terstruktur, dengan detail tentang kesalahan, ke klien.

Filter Pengecualian Mengikat

Anda dapat mengikat filter pengecualian ke pengontrol atau seluruh aplikasi Anda, bergantung pada kebutuhan Anda.

Untuk mengikat filter pengecualian secara global, pertama-tama impor filter pengecualian ke dalam file utama.ts mengajukan. Lalu, berikan contoh filter pengecualian Anda ke aplikasi.useGlobalFilters metode:

// main.ts
import { NestFactory } from'@nestjs/core';
import { AppModule } from'./app.module';
import { HttpExceptionFilter } from'./exception/http.exception';

asyncfunctionbootstrap() {
const app = await NestFactory.create(AppModule);

// Bind filter to the application
app.useGlobalFilters(new HttpExceptionFilter());

await app.listen(4050);
}

bootstrap();

Untuk mengikat pengecualian ke pengontrol, impor GunakanFilter dekorator dan filter pengecualian Anda. Beri anotasi pada kelas pengontrol Anda dengan @GunakanFilter dekorator dan meneruskan instance filter pengecualian Anda sebagai argumen ke dekorator:

@Controller()
@UseFilters(new HttpExceptionFilter())
exportclassAppController{}

Tempat Anda mengikat filter akan menentukan cakupan penanganan kesalahan Anda. Filter terikat pengontrol hanya akan melayani pengontrol yang Anda ikat, dan filter terikat aplikasi akan melayani seluruh aplikasi.

Menggunakan Pengecualian Bawaan untuk Melempar Kesalahan

Nest.js menyediakan kelas pengecualian bawaan yang dapat Anda gunakan untuk memunculkan kesalahan.

Misalnya, Anda bisa melempar 404 kesalahan kode status dengan NotFoundException kelas:

 getUserById(id: number) {
const user = users.find((user) => user.id id);

if (!user) {
thrownew NotFoundException({
message: `User with id ${id} not found`,
});
}
}

Blok kode ini menggunakan pernyataan bersyarat untuk memeriksa apakah pengguna tertentu ada. Jika tidak, ia akan memunculkan kesalahan 404 menggunakan NotFoundException, menyampaikan pesan sebagai argumen.

Kelas Pengecualian Bawaan Umum

Kelas pengecualian bawaan lainnya mencakup, namun tidak terbatas pada, berikut ini.

  • Pengecualian Permintaan Buruk: Melemparkan pengecualian yang menunjukkan permintaan buruk dengan kode status 400. Anda dapat menggunakan pengecualian ini ketika permintaan klien tidak valid atau formatnya salah, dan server tidak dapat memprosesnya karena kesalahan klien. Biasanya ini menyiratkan bahwa klien perlu mengubah permintaan agar valid.
  • Pengecualian Tidak Sah: Melemparkan pengecualian yang menunjukkan akses tidak sah dengan kode status 401. Anda dapat menggunakan pengecualian ini ketika pengguna tidak diautentikasi atau tidak memiliki izin yang diperlukan untuk mengakses sumber daya.
  • Pengecualian Terlarang: Melemparkan pengecualian yang menunjukkan akses terlarang dengan kode status 403. Anda dapat menggunakan pengecualian ini ketika ada pengguna diautentikasi tetapi tidak diotorisasi untuk melakukan tindakan tertentu.
  • Pengecualian Waktu Habis Permintaan: Melemparkan pengecualian yang menunjukkan bahwa permintaan telah habis waktunya dengan kode status 408. Anda dapat menggunakan pengecualian ini ketika server menghentikan permintaan karena memerlukan waktu terlalu lama untuk memprosesnya.
  • Pengecualian Konflik: Melemparkan pengecualian yang menunjukkan konflik dengan kode status 409. Anda dapat menggunakan pengecualian ini jika terdapat konflik antara permintaan klien dan status sumber daya saat ini, misalnya saat mencoba membuat sumber daya yang sudah ada.
  • InternalServerErrorException: Melemparkan pengecualian yang menunjukkan kesalahan server internal dengan kode status 500. Anda dapat menggunakan pengecualian ini ketika terjadi kesalahan tak terduga di sisi server, yang menunjukkan bahwa server tidak dapat memenuhi permintaan karena masalah internal.

Praktik Terbaik untuk Penanganan Kesalahan di Nest.js

Saat menangani error di Nest.js, pastikan untuk menggunakan filter pengecualian untuk menangkap dan menangani pengecualian secara global atau per pengontrol. Anda juga dapat membuat filter khusus untuk jenis pengecualian tertentu.

Selain itu, pastikan Anda menggunakan kelas pengecualian bawaan yang sesuai untuk menghasilkan kesalahan yang tepat dan bermakna. Praktik ini dapat meningkatkan keandalan aplikasi Nest.js Anda secara signifikan.