node.js - Apa perbedaan antara Interceptor vs Middleware vs Filter di Nest.js?


Apa perbedaan antara Interceptor, Filter, dan Middleware dalam kerangka kerja Nest.js? Kapan salah satunya harus digunakan dan lebih disukai dibanding yang lain?

Terima kasih

Jawaban #1

Seperti yang sudah Anda singgung dengan pertanyaan Anda, ketiganya adalah konsep yang sangat mirip dan dalam banyak kasus sulit untuk memutuskan dan tergantung pada preferensi Anda. Tapi saya bisa memberikan gambaran tentang perbedaannya:

Interceptor

Interceptor memiliki akses ke respon/permintaan sebelum dan setelah penangkap rute dipanggil.

Pendaftaran

  • Langsung di kelas controller dengan @UseInterceptors() yang memiliki cakupan controller atau metode
  • Secara global dengan app.useGlobalInterceptors() di main.ts

Contoh

  • LoggingInterceptor: Permintaan sebelum penangan rute dan setelah hasilnya. Ukur waktu yang dibutuhkan.
  • ResultMapping: Ubah null menjadi [] atau bungkus hasil dalam objek respons: users -> {users: users}

Kesimpulan

Saya suka bahwa pendaftarannya lebih dekat dengan penangkap rute dibandingkan dengan middleware. Tetapi ada beberapa keterbatasan, misalnya, Anda tidak dapat mengatur kode respons atau mengubah respons dengan Interceptor ketika Anda mengirim response dengan objek @Res() yang spesifik untuk pustaka dalam penangkap rute Anda, lihat dokumen.

Perangkat lunak perantara

Middleware hanya dipanggil sebelum penangan rute dipanggil. Anda memiliki akses ke objek respons, tetapi Anda tidak memiliki hasil dari penangan rute. Mereka pada dasarnya adalah fungsi middleware express.

Pendaftaran

  • Dalam modul, cara yang sangat fleksibel untuk memilih rute yang relevan (dengan wildcard, berdasarkan metode,...)
  • Secara global dengan app.use() di main.ts

Contoh

  • FrontendMiddleware: alihkan semua rute kecuali API ke index.html, lihat thread ini
  • Anda bisa menggunakan middleware express apa pun yang ada di luar sana. Ada banyak perpustakaan, misalnya body-parser atau morgan

Kesimpulan

Pendaftaran middleware sangat fleksibel, misalnya: diterapkan ke semua rute kecuali satu, dll. Tapi karena mereka didaftarkan di modul, Anda mungkin tidak menyadari bahwa itu berlaku untuk controller Anda ketika Anda melihat metodenya. Juga sangat bagus bahwa Anda dapat memanfaatkan semua pustaka middleware express yang ada di luar sana.

Filter Pengecualian

Filter Eksepsi dipanggil setelah penangan rute dan setelah interceptor. Mereka adalah tempat terakhir untuk melakukan perubahan sebelum respons dikirim keluar.

Pendaftaran

  • Langsung di kelas controller dengan @UseFilters() yang diatur pada tingkat controller atau metode
  • Secara global app.useGlobalFilters() di main.ts Anda

Contoh

  • FilterTidakBerlisensi: Peta ke pesan yang mudah dipahami oleh pengguna
  • NotFoundFilter: Peta semua rute yang tidak ditemukan (tidak bagian dari API Anda) ke index.html Anda.

Kesimpulan

Kasus penggunaan dasar untuk filter pengecualian adalah memberikan pesan kesalahan yang dapat dipahami (menyembunyikan detail teknis). Tetapi ada juga cara penggunaan kreatif lainnya: Ketika Anda melayani aplikasi halaman tunggal, maka biasanya semua rute harus diarahkan ke index.html kecuali rute API Anda. Di sini, Anda bisa mengarahkan pada NotFoundException. Beberapa orang mungkin menganggap ini cerdas, yang lain menganggapnya asal-asalan. Pilihan ada di tangan Anda. ;-)


Jadi urutan eksekusinya adalah:

Middleware -> Interseptor -> Penanganan Rute -> Interseptor -> Filter Pengecualian (jika pengecualian terjadi)

Dengan ketiganya, Anda dapat menyuntikkan ketergantungan lain (seperti layanan, ...) di konstruktor mereka.

Jawaban #2

Bagi kita yang lebih mudah memahaminya secara visual, saya telah membuat diagram pipeline NestJs ini berdasarkan versi terbaru v6.10. Silakan tunjukkan jika ada ketidakakuratan. Saya akan meninjau dan memperbaruinya segera, jika diperlukan.

Jawaban #3

Saya mengasumsikan bahwa yang Anda maksud adalah Pipes bukan Filters karena Filters terutama terkait dengan Penanganan Exception.

Tentu saja ada beberapa tumpang tindih karena Middleware adalah cara fleksibel untuk menyusun aplikasi web apa pun tetapi lebih merupakan konsep umum (membuat tumpukan fungsi untuk membangun sebuah pipeline). Yang lain adalah konsep khusus Nest dan karena itu lebih terikat secara alami dengan hal-hal seperti Dependency Injection.

Pipa digunakan untuk mengubah data input (dan opsional untuk melakukan validasi).

Interceptor itu sangat menarik karena mereka dapat mengubah baik data yang masuk maupun keluar dari API Anda. Mereka memberi Anda kemampuan untuk memodifikasi apa yang seharusnya dikembalikan oleh handler asli melalui penggunaan aliran observable. Ini adalah sesuatu yang mungkin perlu Anda terapkan menggunakan dua middleware (di kedua sisi handler).

Gunakan Pipes ketika Anda ingin mengubah data yang masuk ke handler.

Gunakan Interceptor ketika transformasi dua arah diperlukan.

Gunakan middleware ketika Anda ingin lebih dekat dengan cara tradisional (misalnya Express) dalam membangun aplikasi web Anda atau ketika Anda ingin menerapkan fungsionalitas secara lebih luas ke banyak handler sekaligus (ada lebih sedikit dekorator yang berserakan di kode Anda).

Artikel terkait