
Cara cepat memulai VUE3.0: Masuk dan pelajari
Nest.js adalah kerangka back-end Nodejs. Ini merangkum platform ekspres dan http lainnya untuk memecahkan masalah arsitektur. Ini menyediakan MVC, IOC, AOP dan fitur arsitektur lainnya yang tidak dimiliki express, membuat kode lebih mudah untuk dipelihara dan diperluas.
Apa yang dimaksud dengan MVC, IOC, dan AOP disini? Mari kita lihat secara terpisah:
MVC adalah singkatan dari Model View Controller. Di bawah arsitektur MVC, permintaan pertama-tama akan dikirim ke Controller, yang akan mengirimkan Layanan lapisan Model untuk menyelesaikan logika bisnis, dan kemudian mengembalikan Tampilan yang sesuai.

Nest.js menyediakan dekorator @Controller untuk mendeklarasikan Controller:

Layanan akan dideklarasikan dengan dekorator @Injectable:

Kelas yang dideklarasikan melalui dekorator @Controller dan @Injectable akan dipindai oleh Nest.js, objek terkait akan dibuat dan ditambahkan ke wadah. Semua objek ini akan secara otomatis disuntikkan sesuai dengan dependensi yang dideklarasikan dalam konstruktor, yaitu DI (dependency inject) ), ide ini disebut IOC (Inverse Of Control).
Keuntungan arsitektur IOC adalah tidak perlu membuat objek secara manual dan meneruskannya ke konstruktor objek berbeda berdasarkan dependensi.
Selain itu Nest.js juga menyediakan kemampuan AOP (Aspect Oriented Programming), yaitu kemampuan pemrograman berorientasi aspek:
Apa yang dimaksud dengan AOP? Apa itu pemrograman berorientasi aspek?
Permintaan dapat melalui logika Controller, Service, dan Repository (akses database):

Jika Anda ingin menambahkan logika umum ke tautan panggilan ini, bagaimana cara menambahkannya? Seperti logging, kontrol izin, penanganan pengecualian, dll.
Yang mudah untuk dipikirkan adalah dengan langsung mengubah kode lapisan Pengontrol dan menambahkan logika ini. Ini berhasil, namun tidak elegan karena logika umum ini menyerang logika bisnis. Bisakah kita secara transparan menambahkan log, izin, dll. ke logika bisnis ini?
Apakah mungkin menambahkan tahapan untuk menjalankan logika umum sebelum dan sesudah memanggil Pengendali?
Misalnya:

Titik perluasan horizontal seperti itu disebut aspek, dan metode pemrograman yang secara transparan menambahkan beberapa logika aspek disebut AOP (pemrograman berorientasi aspek).
Keuntungan AOP adalah dapat memisahkan beberapa logika umum ke dalam aspek dan menjaga logika bisnis tetap murni. Dengan cara ini, logika aspek dapat digunakan kembali dan ditambahkan serta dihapus secara dinamis.
Faktanya, model bawang pada middleware Express juga merupakan implementasi dari AOP, karena Anda dapat membungkus lapisan luar secara transparan dan menambahkan beberapa logika, dan lapisan dalam tidak akan terlihat.
Nest.js memiliki lebih banyak cara untuk mengimplementasikan AOP, total ada lima, termasuk Middleware, Guard, Pipe, Inteceptor, ExceptionFilter:,
Nest.js didasarkan pada Express dan secara alami dapat menggunakan middleware, tetapi telah dibagi lagi. , dibagi menjadi middleware global dan middleware perutean:
middleware global adalah middleware Express. Beberapa logika pemrosesan ditambahkan sebelum dan sesudah permintaan.

Middleware perutean ditujukan untuk rute tertentu, dengan cakupan yang lebih kecil:

Konsep ini mewarisi langsung Express dan lebih mudah dipahami.
Mari kita lihat beberapa konsep Nest.js yang diperluas, seperti Guard:
Guard berarti penjaga perutean. Ini dapat digunakan untuk menentukan izin sebelum memanggil Pengendali dan mengembalikan nilai true atau false untuk memutuskan apakah akan melepaskan:

Cara membuat Guard adalah sebagai berikut:

Penjaga perlu mengimplementasikan antarmuka CanActivate dan metode canActive. Ia bisa mendapatkan informasi yang diminta dari konteksnya, dan kemudian melakukan beberapa verifikasi izin dan pemrosesan lainnya sebelum mengembalikan benar atau salah.
Tambahkan ke kontainer IOC melalui dekorator @Injectable, lalu aktifkan di Controller:

Pengontrolnya sendiri tidak perlu dimodifikasi, namun logika penilaian izin ditambahkan secara transparan. Inilah manfaat arsitektur AOP.
Dan, sama seperti Middleware yang mendukung tingkat global dan rute, Guard juga dapat diaktifkan secara global:

Penjaga dapat mengabstraksi logika kontrol akses perutean, tetapi tidak dapat mengubah permintaan dan respons. Logika ini dapat menggunakan Interceptor:
Interceptor berarti interseptor. Anda dapat menambahkan beberapa logika sebelum dan sesudah metode Pengendali target:

Cara membuat Inteceptor adalah sebagai berikut:

Interceptor perlu mengimplementasikan antarmuka NestInterceptor dan metode intersep. Memanggil next.handle() akan memanggil Pengendali target. Anda dapat menambahkan beberapa logika pemrosesan sebelum dan sesudah.
Logika pemrosesan sebelum dan sesudah Pengontrol mungkin tidak sinkron. Nest.js mengaturnya melalui rxjs, sehingga Anda dapat menggunakan berbagai operator rxjs.
Interceptor mendukung setiap rute yang diaktifkan secara individual, yang hanya mempengaruhi pengontrol tertentu, dan juga mendukung pengaktifan global, yang mempengaruhi semua pengontrol:


Selain kontrol izin rute dan pemrosesan sebelum dan sesudah Pengontrol target, yang semuanya merupakan logika umum, pemrosesan parameter juga merupakan logika umum, sehingga Nest.js juga mengekstrak aspek terkait, yaitu Pipa:
Pipe artinya pipa, digunakan untuk melakukan beberapa verifikasi dan konversi parameter:

Cara membuat Pipa adalah sebagai berikut:

Pipe perlu mengimplementasikan antarmuka PipeTransform dan metode transformasi, yang dapat melakukan verifikasi parameter pada nilai parameter yang masuk, seperti apakah format dan jenisnya benar, jika tidak benar, pengecualian akan diberikan. Anda juga dapat melakukan konversi dan mengembalikan nilai yang dikonversi.
Ada 8 Pipes bawaan, dan artinya dapat dilihat dari namanya:
ValidationPipeParseIntPipeParseBoolPipeParseArrayPipeParseUUIDPipeDefaultValuePipeParseEnumPipeParseFloatPipeDemikian pula, Pipe hanya dapat berlaku pada rute tertentu, atau dapat diterapkan pada setiap rute:


Baik itu Pipe, Guard, Interceptor, atau Controller yang akhirnya dipanggil, beberapa pengecualian dapat diberikan selama proses tersebut.
Pemetaan pengecualian terhadap respons ini juga merupakan logika umum. Nest.js menyediakan ExceptionFilter untuk mendukung:
ExceptionFilter dapat menangani pengecualian yang diberikan dan mengembalikan respons yang sesuai:

Bentuk pembuatan ExceptionFilter adalah sebagai berikut:

Pertama, Anda perlu mengimplementasikan antarmuka ExceptionFilter dan metode catch untuk mencegat pengecualian. Namun, pengecualian apa yang ingin Anda intersepsi perlu dideklarasikan dengan dekorator @Catch. Setelah mencegat pengecualian, Anda dapat merespons dengan pengecualian yang sesuai untuk diberikan pengguna prompt yang lebih ramah.
Tentu saja, tidak semua pengecualian akan ditangani. Hanya pengecualian yang mewarisi HttpException yang akan ditangani oleh ExceptionFilter. Nest.js memiliki banyak subkelas bawaan HttpException:
BadRequestExceptionUnauthorizedExceptionNotFoundExceptionForbiddenExceptionNotAcceptableExceptionRequestTimeoutExceptionConflictExceptionGoneExceptionPayloadTooLargeExceptionUnsupportedMediaTypeExceptionUnprocessableExceptionInternalServerErrorExceptionNotImplementedExceptionBadGatewayExceptionServiceUnavailableExceptionGatewayTimeoutExceptionTentu saja, Anda juga dapat memperluasnya sendiri:

Nest.js menyadari korespondensi antara pengecualian dan respons dengan cara ini selama HttpException yang berbeda dimasukkan ke dalam kode, respons yang sesuai akan dikembalikan, yang sangat memudahkan.
Demikian pula, ExceptionFilter juga dapat memilih untuk diterapkan secara global atau diterapkan pada rute tertentu:
rute tertentu:

Global:

Kami memahami mekanisme AOP yang disediakan oleh Nest.js, namun apa hubungan pesanannya?
Middleware, Guard, Pipe, Interceptor, dan ExceptionFilter, secara transparan dapat menambahkan logika pemrosesan tertentu ke rute tertentu atau semua rute.
Tapi apa hubungan berurutan di antara mereka?
Hubungan pemanggilan bergantung pada kode sumber.
Kode sumber yang sesuai adalah sebagai berikut:

Tentunya saat memasuki rute ini, Penjaga akan dipanggil terlebih dahulu untuk menentukan apakah ada izin, dll. Jika tidak ada izin, pengecualian akan diberikan di sini:

HttpException yang dilempar akan ditangani oleh ExceptionFilter.
Jika Anda memiliki izin, pencegat akan dipanggil. Pencegat mengatur rantai, memanggil satu per satu, dan akhirnya memanggil metode pengontrol:

Sebelum memanggil metode pengontrol, pipa akan digunakan untuk memproses parameter:

Setiap parameter akan dikonversi:

Sangat mudah untuk memikirkan waktu pemanggilan ExceptionFilter, yaitu menangani pengecualian sebelum merespons.
Middleware adalah sebuah konsep di express, Nest.js hanya mewarisinya, dan disebut di lapisan terluar.
Ini adalah urutan pemanggilan mekanisme AOP ini. Setelah Anda menyelesaikan hal-hal ini, Anda akan memiliki pemahaman yang baik tentang Nest.js.
Nest.js dienkapsulasi berdasarkan platform http ekspres, dan menerapkan ide arsitektur seperti MVC, IOC, dan AOP.
MVC adalah pembagian Model dan Pengontrol Tampilan. Permintaan pertama-tama melewati Pengontrol, kemudian memanggil Layanan dan Repositori lapisan Model untuk menyelesaikan logika bisnis, dan akhirnya mengembalikan Tampilan yang sesuai.
IOC berarti Nest.js akan secara otomatis memindai kelas dengan dekorator @Controller dan @Injectable, membuat objeknya, dan secara otomatis memasukkan objek yang bergantung padanya berdasarkan dependensi, sehingga menghilangkan kesulitan dalam membuat dan merakit objek secara manual.
AOP mengekstrak logika umum dan menambahkannya ke tempat tertentu melalui aspek. AOP dapat menggunakan kembali dan secara dinamis menambah dan menghapus logika aspek.
Middleware, Guard, Interceptor, Pipe, dan ExceptionFileter Nest.js semuanya merupakan implementasi dari ide AOP. Semuanya hanyalah aspek di lokasi yang berbeda. Semuanya dapat diterapkan secara fleksibel pada rute tertentu atau semua rute.
Kami melihat urutan pemanggilan mereka melalui kode sumber. Middleware adalah konsep Express. Di lapisan terluar, setelah mencapai rute tertentu, Penjaga akan dipanggil terlebih dahulu untuk menentukan apakah rute tersebut memiliki izin untuk mengakses, dan kemudian Interceptor akan dipanggil. Perluas beberapa logika bolak-balik, dan panggil Pipe untuk memverifikasi dan mengonversi parameter sebelum mencapai Pengendali target. Semua pengecualian HttpException akan ditangani oleh ExceptionFilter dan mengembalikan respons yang berbeda.
Nest.js menggunakan arsitektur AOP ini untuk mencapai arsitektur yang digabungkan secara longgar, mudah dipelihara, dan diperluas.
Sudahkah Anda merasakan manfaat arsitektur AOP?