Artikel ini akan membawa anda melalui seni bina AOP Node rangka kerja belakang Nest.js dan memperkenalkan manfaat seni bina AOP Nest.js saya harap ia akan membantu semua orang.
Nest.js ialah rangka kerja bahagian belakang Nodejs Ia merangkum platform http ekspres dan lain untuk menyelesaikan masalah seni bina. Ia menyediakan MVC, IOC, AOP dan ciri-ciri seni bina lain yang nyata tidak mempunyai, menjadikan kod lebih mudah untuk dikekalkan dan dikembangkan.
Apakah maksud MVC, IOC dan AOP di sini? Mari kita lihat masing-masing:
MVC ialah singkatan dari Model View Controller. Di bawah seni bina MVC, permintaan mula-mula dihantar kepada Pengawal, yang menghantar lapisan Perkhidmatan Model untuk melengkapkan logik perniagaan, dan kemudian mengembalikan Paparan yang sepadan.
Nest.js menyediakan penghias @Controller untuk mengisytiharkan Pengawal:
Dan Perkhidmatan akan dihiasi dengan @Injectable Untuk mengisytiharkan:
Kelas yang diisytiharkan melalui @Controller dan penghias @Injectable akan diimbas oleh Nest.js, objek yang sepadan akan dibuat dan ditambahkan pada bekas ini Objek akan disuntik secara automatik mengikut kebergantungan yang diisytiharkan dalam pembina, iaitu DI (dependency inject) Idea ini dipanggil IOC (Inverse Of Control).
Kelebihan seni bina IOC ialah tidak perlu mencipta objek secara manual dan menghantarnya ke dalam pembina objek berbeza berdasarkan kebergantungan Semuanya diimbas, dicipta dan disuntik secara automatik.
Selain itu, Nest.js turut menyediakan keupayaan AOP (Aspect Oriented Programming), iaitu keupayaan pengaturcaraan berorientasikan aspek:
Apakah AOP Apakah maksudnya? Apakah pengaturcaraan berorientasikan aspek?
Permintaan mungkin melalui logik Pengawal, Perkhidmatan dan Repositori (akses pangkalan data):
Jika anda mahu Bagaimana untuk menambah beberapa logik umum ke pautan panggilan ini? Seperti pembalakan, kawalan kebenaran, pengendalian pengecualian, dsb.
Perkara mudah untuk difikirkan ialah mengubah terus kod lapisan Pengawal dan menambah logik ini. Ini berfungsi, tetapi ia tidak elegan kerana logik biasa ini menyerang logik perniagaan. Bolehkah kita menambahkan log, kebenaran, dsb. secara telus pada logik perniagaan ini?
Adakah mungkin untuk menambah peringkat untuk melaksanakan logik biasa sebelum dan selepas memanggil Pengawal?
Contohnya:
Titik pengembangan mendatar sedemikian dipanggil aspek, dan kaedah pengaturcaraan jenis ini yang secara telus menambah beberapa logik aspek dipanggil AOP (Aspect berorientasikan) pengaturcaraan).
Kelebihan AOP ialah ia boleh memisahkan beberapa logik umum kepada aspek dan mengekalkan logik perniagaan tulen, supaya logik aspek boleh digunakan semula dan ditambah dan dipadamkan secara dinamik
Malah, model onion middleware Express juga merupakan pelaksanaan AOP, kerana anda boleh membungkus lapisan secara telus di bahagian luar dan menambah sedikit logik, dan lapisan dalam tidak akan menyedarinya.
Dan Nest.js mempunyai lebih banyak cara untuk melaksanakan AOP, terdapat lima kesemuanya, termasuk Middleware, Guard, Pipe, Inteceptor, ExceptionFilter:,
Nest . js secara semula jadi boleh menggunakan middleware berdasarkan Express, tetapi ia telah dibahagikan lagi kepada middleware global dan middleware penghalaan:
Middleware global ialah jenis middleware dalam Express, yang digunakan sebelum meminta dan Kemudian tambah beberapa logik pemprosesan, dan setiap permintaan akan pergi ke sini:
Perisian tengah penghalaan adalah untuk laluan tertentu, dengan skop yang lebih kecil:
Ini adalah konsep yang secara langsung mewarisi Express dan lebih mudah difahami.
Mari kita lihat beberapa konsep sambungan Nest.js, seperti Pengawal:
Pengawal bermaksud pengawal penghalaan, yang boleh digunakan untuk menentukan kebenaran sebelum memanggil Pengawal , kembalikan benar atau salah untuk memutuskan sama ada untuk melepaskan:
Cara untuk mencipta Guard adalah seperti berikut:
Guard perlu melaksanakan antara muka CanActivate dan kaedah canActive Ia boleh mendapatkan maklumat yang diminta daripada konteks, dan kemudian melakukan beberapa pengesahan kebenaran dan pemprosesan lain sebelum mengembalikan benar atau salah.
Tambahkannya pada bekas IOC melalui penghias @Injectable, dan kemudian dayakannya dalam Pengawal:
Pengawal itu sendiri tidak perlu diubah suai . Tetapi logik penghakiman kebenaran ditambah secara telus Ini adalah faedah seni bina AOP.
Dan, seperti Middleware menyokong tahap global dan tahap penghalaan, Guard juga boleh didayakan secara global:
Guard boleh mengabstrak logik kawalan akses penghalaan, Walau bagaimanapun, permintaan dan respons tidak boleh diubah suai. Logik jenis ini boleh menggunakan Pemintas:
Pemintas bermaksud pemintas Anda boleh menambah beberapa logik sebelum dan selepas kaedah Pengawal sasaran:
Cara untuk mencipta Inteceptor adalah seperti berikut:
Interceptor Untuk melaksanakan antara muka NestInterceptor, laksanakan kaedah pintasan dan panggil next.handle() Pengawal sasaran akan dipanggil, dan beberapa logik pemprosesan boleh ditambah sebelum dan selepas.
Logik pemprosesan sebelum dan selepas Pengawal mungkin tidak segerak. Nest.js menyusunnya melalui rxjs, jadi anda boleh menggunakan pelbagai pengendali rxjs.
Pemintas menyokong pengaktifan bebas bagi setiap laluan, yang hanya mempengaruhi pengawal tertentu Ia juga menyokong pengaktifan global, yang mempengaruhi semua pengawal:
Selain penghalaan kawalan kebenaran dan pemprosesan sebelum dan selepas Pengawal sasaran, yang semuanya logik biasa, pemprosesan parameter juga merupakan logik biasa, jadi Nest.js juga mengekstrak aspek yang sepadan, iaitu, Paip:
Paip bermaksud saluran paip dan digunakan untuk melakukan beberapa pengesahan dan penukaran parameter:
Cara untuk mencipta Paip adalah seperti berikut :
Paip perlu melaksanakan antara muka PipeTransform dan melaksanakan kaedah transformasi, yang boleh melakukan pengesahan parameter pada nilai parameter masuk, seperti sama ada format dan jenis adalah betul. Anda juga boleh melakukan penukaran dan mengembalikan nilai yang ditukar.
Terdapat 8 Paip terbina dalam, dan maknanya boleh dilihat daripada namanya:
ValidationPipe
ParseIntPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
DefaultValuePipe
ParseEnumPipe
ParseFloatPipe
Begitu juga, Paip hanya boleh berkuat kuasa pada laluan tertentu, atau ia boleh berkuat kuasa pada setiap laluan:
Sama ada Paip, Pengawal, Pemintas atau Pengawal yang akhirnya dipanggil, beberapa pengecualian boleh dilemparkan semasa proses Bagaimana untuk bertindak balas terhadap pengecualian tertentu?
Pemetaan pengecualian kepada respons ini juga merupakan logik biasa Nest.js menyediakan ExceptionFilter untuk menyokong:
ExceptionFilter boleh mengendalikan pengecualian yang dilemparkan, kembalikan respons yang sepadan:
Bentuk mencipta ExceptionFilter adalah seperti berikut:
Pertama, laksanakan antara muka ExceptionFilter, Dengan melaksanakan tangkapan kaedah, anda boleh memintas pengecualian, tetapi pengecualian yang anda ingin memintas perlu diisytiharkan dengan penghias @Catch Selepas memintas pengecualian, anda boleh bertindak balas dengan pengecualian yang sepadan untuk memberi pengguna gesaan yang lebih mesra.
Sudah tentu, bukan semua pengecualian akan dikendalikan Hanya pengecualian yang mewarisi HttpException akan dikendalikan oleh ExceptionFilter.js mempunyai banyak subkelas terbina dalam HttpException:
BadRequestException
UnauthorizedException
NotFoundException
ForbiddenException
NotAcceptableException
RequestTimeoutException
ConflictException
GoneException
PayloadTooLargeException
UnsupportedMediaTypeException
UnprocessableException
InternalServerErrorException
NotImplementedException
BadGatewayException
ServiceUnavailableException
GatewayTimeoutException
Nest.js mencapai hubungan yang sepadan antara pengecualian dan respons dengan cara ini selagi berbeza lontaran dilemparkan dalam kod HttpException, tindak balas yang sepadan akan dikembalikan, yang sangat mudah.
Begitu juga, ExceptionFilter juga boleh memilih untuk berkuat kuasa secara global atau laluan tertentu: Laluan tertentu: Secara global : Kami memahami mekanisme AOP yang disediakan oleh Nest.js, tetapi apakah hubungan berjujukan mereka? Jujukan beberapa mekanisme AOPPerisian Tengah, Pengawal, Paip, Pemintas dan Penapis Pengecualian semuanya boleh menambah logik pemprosesan tertentu secara telus pada laluan tertentu atau semua laluan Ini adalah faedah AOP. Tetapi apakah hubungan berurutan antara mereka? Hubungan panggilan bergantung pada kod sumber. Kod sumber yang sepadan adalah seperti berikut: Jelas sekali, apabila memasuki laluan ini, Guard akan dipanggil terlebih dahulu untuk menentukan sama ada terdapat kebenaran, dsb. ., jika bukan Kebenaran, pengecualian dilemparkan di sini: HttpException yang dilemparkan akan dikendalikan oleh ExceptionFilter. Jika anda mempunyai kebenaran, pemintas akan dipanggil Pemintas mengatur rantai, memanggil satu demi satu, dan akhirnya memanggil kaedah pengawal: Sebelum memanggil kaedah pengawal, paip akan digunakan untuk memproses parameter: Setiap parameter akan ditukar:Masa panggilan ExceptionFilter mudah difikirkan, iaitu mengendalikan pengecualian sebelum membalas. Dan Middleware ialah konsep dalam bentuk ekspres Nest.js hanya mewarisinya dan ia dipanggil pada lapisan paling luar. Ini ialah urutan panggilan bagi mekanisme AOP ini. Setelah anda menyelesaikan perkara ini, anda akan memahami Nest.js dengan baik. RingkasanNest.js ialah lapisan enkapsulasi berdasarkan platform http seperti ekspres dan menggunakan idea seni bina seperti MVC, IOC dan AOP. MVC ialah pembahagian Model dan View Controller Permintaan mula-mula melalui Pengawal, kemudian memanggil Perkhidmatan dan Repositori lapisan Model untuk melengkapkan logik perniagaan, dan akhirnya mengembalikan Paparan yang sepadan. IOC bermakna Nest.js akan mengimbas kelas secara automatik dengan @Controller dan penghias @Injectable, mencipta objeknya dan secara automatik menyuntik objek yang bergantung padanya berdasarkan kebergantungan, menghapuskan masalah pembuatan dan pemasangan secara manual. AOP mengekstrak logik umum dan menambahkannya ke tempat tertentu melalui aspek Ia boleh menggunakan semula dan menambah serta memadam logik aspek secara dinamik. Middleware, Guard, Interceptor, Pipe, dan ExceptionFileter of Nest.js adalah semua pelaksanaan idea AOP Semuanya boleh digunakan secara fleksibel pada laluan tertentu atau semua laluan ini ialah Kelebihan AOP. Kami melihat urutan panggilan mereka melalui kod sumber adalah konsep Ekspres Pada lapisan paling luar, selepas mencapai laluan tertentu, Pengawal akan digunakan untuk menentukan sama ada laluan itu kebenaran untuk mengakses, dan kemudian Pemintas akan dipanggil untuk melanjutkan beberapa logik sebelum dan selepas Pengawal Sebelum mencapai Pengawal sasaran, Paip akan dipanggil untuk mengesahkan dan menukar parameter. Semua pengecualian HttpException akan dikendalikan oleh ExceptionFilter dan mengembalikan respons yang berbeza. Nest.js menggunakan seni bina AOP ini untuk mencapai seni bina yang gandingan longgar, mudah diselenggara dan dikembangkan. Adakah anda merasakan faedah seni bina AOP? Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:
tutorial nodejs!
Atas ialah kandungan terperinci Fahami seni bina AOP Node.js Nest.js dan bincangkan tentang faedahnya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!