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:
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!