NestJS adalah kerangka kerja yang dirancang untuk membuat hidup lebih mudah bagi pengembang, menggunakan pendekatan arsitektur yang tepat dan mendikte aturannya sendiri.
Oleh karena itu, NestJS tidak hanya kerangka backend, tetapi juga kesempatan untuk memasuki dunia konsep-konsep canggih, seperti
DDD ,
sumber acara dan arsitektur layanan mikro. Semuanya dikemas dalam cara yang sederhana dan mudah, jadi pilihan ada di tangan Anda - apakah Anda memutuskan untuk menggunakan seluruh platform atau hanya menggunakan komponen-komponennya.
Pertama, saya akan memberi tahu Anda tentang pengalaman saya. Untuk waktu yang lama saya menulis di ASP.NET, lalu ada frontend di AngularJS. Pada Oktober 2016, ada peralihan ke Angular dan Typecript. Dan ini dia! Mengetik di frontend, Anda dapat melakukan hal-hal rumit dengan mudah! Sebelum ini (pengembangan pada nestjs) pada node saya mengembangkannya hanya untuk kesenangan, dan entah bagaimana bahkan ada
upaya untuk memperkenalkan praktik yang baik dan naskah ke Koa populer . Tetapi NestJS masih sedikit berbeda.
NestJS, sebuah kerangka kerja yang sepenuhnya ditulis dalam TypeScript (ini juga mendukung JS, tetapi tipenya sangat bagus), mudah untuk menguji dan berisi semua yang Anda butuhkan.
Bagaimana cara membuat aplikasi sederhana di NestJS?NestJS telah mengekspresikan di bawah tenda. Setiap ekstensi untuk ekspres mudah diterapkan di Nest. Tapi ini bukan intinya di sini, dengan keinginan yang kuat, ekspresi dapat diambil dan diubah.
Pertama, Anda dapat menyalin starter kit kecil untuk diri sendiri:
git clone https://github.com/nestjs/typescript-starter.git project
Server.ts mencakup fungsi asinkron yang bertanggung jawab untuk memuat aplikasi kami:
import { NestFactory } from '@nestjs/core'; import { ApplicationModule } from './modules/app.module'; async function bootstrap() { const app = await NestFactory.create(ApplicationModule); await app.listen(3000); } bootstrap();
Nah, kemudian mulai jalankan npm mulai dan melihat aplikasi pada port 3000.
Terbuat dari apa NestJS?Penulis kerangka ini terinspirasi oleh ide-ide Angular, dan NestJS ternyata sangat mirip dengan Angular, terutama di versi sebelumnya.
PengontrolLapisan pengontrol bertanggung jawab untuk memproses permintaan yang masuk dan mengembalikan respons ke klien. Contoh pengontrol sederhana:
import { Controller, Get } from '@nestjs/common'; @Controller('cats') export class CatsController { @Get() findAll() { return []; } }
PenyediaHampir semuanya adalah Penyedia - Layanan, Repositori, Pabrik, Pembantu, dll. Mereka dapat diimplementasikan dalam pengontrol dan penyedia lainnya. Jika Anda mengatakan bahasa Angular - itu semua `@Injectables
Misalnya, layanan reguler:
import { Injectable } from '@nestjs/common'; import { Cat } from './interfaces/cat.interface'; @Injectable() export class CatsService { private readonly cats: Cat[] = []; create(cat: Cat) { this.cats.push(cat); } findAll(): Cat[] { return this.cats; } }
ModulModul adalah kelas dengan dekorator
Module (). Dekorator
Module () menyediakan metadata yang digunakan Nest untuk mengatur struktur aplikasi. Setiap aplikasi Nest memiliki setidaknya satu modul, modul root. Modul root adalah tempat Nest mulai mengatur pohon aplikasi. Sebenarnya, modul root mungkin satu-satunya modul dalam aplikasi Anda, terutama ketika aplikasinya kecil, tetapi itu tidak masuk akal. Dalam kebanyakan kasus, Anda akan memiliki beberapa modul, yang masing-masing memiliki serangkaian fitur yang terkait erat. Di Nest, modul adalah singleton secara default, sehingga Anda dapat dengan mudah berbagi instance komponen yang sama antara dua atau lebih modul.
import { Module } from '@nestjs/common'; import { CatsController } from './cats.controller'; import { CatsService } from './cats.service'; @Module({ controllers: [CatsController], components: [CatsService], }) export class CatsModule {}
Sedikit tentang modul dinamisSistem modular Nest dilengkapi dengan fungsi modul dinamis. Ini memungkinkan Anda membuat modul khusus tanpa kesulitan. Mari kita lihat di DatabaseModule:
import { Module, DynamicModule } from '@nestjs/common'; import { createDatabaseProviders } from './database.providers'; import { Connection } from './connection.component'; @Module({ components: [Connection], }) export class DatabaseModule { static forRoot(entities = [], options?): DynamicModule { const providers = createDatabaseProviders(options, entities); return { module: DatabaseModule, components: providers, exports: providers, }; } }
Ini mendefinisikan komponen Koneksi secara default, tetapi selain itu - tergantung pada opsi dan entitas yang ditransfer - membuat koleksi penyedia, misalnya, komponen repositori. Bahkan, modul dinamis memperluas metadata modul. Fitur penting ini berguna ketika Anda perlu mendaftarkan komponen secara dinamis. Kemudian Anda dapat mengimpor DatabaseModule sebagai berikut:
import { Module } from '@nestjs/common'; import { DatabaseModule } from './database/database.module'; import { User } from './users/entities/user.entity'; @Module({ imports: [ DatabaseModule.forRoot([User]), ], }) export class ApplicationModule {}
Omong-omong, untuk bekerja dengan database ada
TypeORM keren yang dapat bekerja dengan sebagian besar database.
MiddlewaresMiddlewares adalah fungsi yang disebut sebelum pengendali rute. Mereka memiliki akses untuk meminta dan merespons. Bahkan, mereka sama seperti di
ekspres .
import { Injectable, NestMiddleware, MiddlewareFunction } from '@nestjs/common'; @Injectable() export class LoggerMiddleware implements NestMiddleware { resolve(...args: any[]): MiddlewareFunction { return (req, res, next) => { console.log('Request...'); next(); }; } }
Filter pengecualianNest memiliki lapisan pengecualian, yang bertanggung jawab untuk menangkap pengecualian yang tidak ditangani dan mengembalikan respons yang sesuai kepada pengguna akhir.
Setiap pengecualian ditangani oleh filter pengecualian global, dan ketika itu tidak dikenali (bukan HttpException atau kelas yang mewarisi HttpException), pengguna menerima respons JSON berikut:
{ "statusCode": 500, "message": "Internal server error" }
PipaPipa harus mengimplementasikan antarmuka PipeTransform.
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common'; @Injectable() export class ValidationPipe implements PipeTransform { transform(value: any, metadata: ArgumentMetadata) { return value; } }
Pipe mengubah input ke hasil yang diinginkan.
Selain itu, ini mungkin berlaku untuk validasi, karena juga mungkin bagi mereka untuk melemparkan pengecualian jika datanya salah. Sebagai contoh:
@Post() @UsePipes(new ValidationPipe(createCatSchema)) async create(@Body() createCatDto: CreateCatDto) { this.catsService.create(createCatDto); }
Atau Anda dapat mendeklarasikan pipa global:
async function bootstrap() { const app = await NestFactory.create(ApplicationModule); app.useGlobalPipes(new ValidationPipe()); await app.listen(3000); } bootstrap();
PenjagaPenjaga harus mengimplementasikan antarmuka CanActivate. Penjaga memiliki tanggung jawab tunggal. Mereka menentukan apakah permintaan harus diproses oleh pengendali rute atau tidak.
@Injectable() export class RolesGuard implements CanActivate { canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> {
PencegatInterceptors memiliki beberapa fitur berguna yang terinspirasi oleh Aspect-Oriented Programming (AOP). Mereka memungkinkan Anda untuk:
- ikat logika tambahan sebelum / setelah metode dijalankan;
- konversi hasil yang dikembalikan oleh fungsi;
- Konversi pengecualian yang dilemparkan dari suatu fungsi
- sepenuhnya mendefinisikan ulang fungsi tergantung pada kondisi yang dipilih (misalnya, untuk caching).
Layanan microserNest Microservice hanyalah sebuah aplikasi yang menggunakan lapisan transport yang berbeda (bukan HTTP).
Nest mendukung dua jenis komunikasi - TCP dan Redis pub / sub, tetapi strategi transportasi baru mudah diimplementasikan dengan mengimplementasikan antarmuka CustomTransportStrategy.
Anda dapat dengan mudah membuat layanan-mikro dari aplikasi Anda:
import { NestFactory } from '@nestjs/core'; import { ApplicationModule } from './modules/app.module'; import { Transport } from '@nestjs/microservices'; async function bootstrap() { const app = await NestFactory.createMicroservice(ApplicationModule, { transport: Transport.TCP, }); app.listen(() => console.log('Microservice is listening')); } bootstrap();
Nest Microservice mengenali pesan berdasarkan pola. Pola adalah nilai sederhana, objek, string, atau bahkan angka.
import { Controller } from '@nestjs/common'; import { MessagePattern } from '@nestjs/microservices'; @Controller() export class MathController { @MessagePattern({ cmd: 'sum' }) sum(data: number[]): number { return (data || []).reduce((a, b) => a + b); } }
Dan untuk komunikasi antara layanan microser, Anda harus menggunakan klien:
@Client({ transport: Transport.TCP, port: 5667 }) client: ClientProxy;
Dan di sini akan dikirimkan pesan:
@Get() call(): Observable<number> { const pattern = { cmd: 'sum' }; const data = [1, 2, 3, 4, 5]; return this.client.send<number>(pattern, data); }
NestJS dan Angular sangat terkait erat sehingga penulis kerangka kerja dapat dengan mudah dilihat di konferensi dan pertemuan. Sebagai contoh, tim nrwl baru-baru ini
memasukkan template nestjs di nx-nya.
ng g node-app nestjs-app -framework nestjs
NestJS sudah cukup matang, dan banyak perusahaan sudah menggunakannya.
Siapa yang menggunakan NestJS dalam produksi sekarang?Kerangka itu sendiri:
https://github.com/nestjs/nestBanyak tautan
terkait keren di sini:
Awesome-nestjsKomunitas NestJS yang berbahasa Rusia dalam telegram
https://t.me/nest_ruLaporan berbahasa Rusia tentang NestJS.Dan tentu saja, berlangganan saluran di telegram
@ngFanatic di mana ada berita tentang NestJS dan Angular.
PS: Ini hanya bagian dari kemampuan NestJS, tentang pengalaman pribadi satu tahun, akan ada artikel terpisah.