NestJS: Bôi trơn trước khi bắt đầu

Dung Tran
4 min readMay 13, 2019

--

Giới thiệu về NestJS

NestJS là framework để xây dựng những ứng dụng ở phía server cho NodeJS. Với NestJS chúng ta có thể phát triển với Javacript, ES hoặc TypeScript. Trong NestJS sử dụng các paradigm như OOP, Functional Programming , Functional Reactive Programming (RxJS).

NestJS sử dụng ExpressJS hoặc Fastify để xây dựng HTTP server. Ngoài ra NestJS cũng cung cấp các API để tương tác với third-parties hoặc có thể custom lại các module riêng.

Các khái niệm cơ bản trong NestJS

Module là một class có nhiệm vụ nhóm lại các class trong NestJS. Trong NestJS, mỗi application phải có ít nhất là một module được gọi là module gốc. Các module khác sẽ được import vào trong module gốc và tương tự như vậy cho cách module nhỏ hơn.

Kiến trúc Module trong NestJS

Mỗi module sẽ đóng gói các class có quan hệ hoặc phụ thuộc nhau. Các module nhỏ hơn sẽ được import vào. Việc chia nhỏ các module sẽ giúp cho việc quản lý hệ thống hiệu quả hơn.

Controller là một class có nhiệm vụ điều phối request và response. Khi một request đến controller thì controller sẽ chuyển nó đến một hay nhiều Service tương ứng. Trong controller, có một hoặc nhiều service khác nhau phục vụ cho nhiều mục đích khác nhau.

Mô tả Controller
import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}

Thông thường controller được sử dụng trong RestAPI để tạo ra những routing để những service tương ứng. Mặc khác có thể sử dụng controller như một proxy class để giải quyết các luồng phức tạp

Provider là khái niệm trong NestJS, đây thường là helpers, services, repositories, factories, v.v… Trong NestJS module, các providers được đặt trong providers properties. Thường những provider sẽ được sử dụng thông qua dependencies injection, và được khai báo với decorator @Injectable

Vòng đời trong NestJS

Giống các framewok khác NestJS cũng cung cấp các API để chúng ta có thể can thiệp vòng đời của các thành phần trong NestJS. Các API này được xử lý thông qua cơ chế hook. Dứơi đây là 4 lifecyle event cơ bản của NestJS

OnModuleInit được gọi khi một module được khởi tạo, hàm này chỉ được gọi một lần.

import { Module,OnModuleInit} from '@nestjs/common';

@Module({})
export class UsersModule implements OnModuleInit{
async onModuleInit() {
await this.fetch();
console.log(`The module has been initialized.`);
}
}

OnModuleDestroy được gọi trước khi một module bị destroy

import { Module,OnModuleDestroy} from '@nestjs/common';

@Module({})
export class UsersModule implements OnModuleDestroy{
async onModuleDestroy() {
await this.notifyToOthers();
console.log(`The module has been destroyed.`);
}
}

OnApplicationBootstrap được gọi một lần khi application đã hoàn toàn được start.

import { Module,OnApplicationBootstrap} from '@nestjs/common';

@Module({})
export class AppModule implements OnApplicationBootstrap{
onApplicationBootstrap() {
console.log(`The application has been bootstraped.`);
}
}

OnApplicationShutdown khi application NestJS sẽ gửi một signal đến hệ thống thông qua Hook. Chức năng này của NestJS thường được sử dụng trên Kubernetes, Heroku … Để sử thì chúng ta phải enable chức năng hook khi shutdown của NestJS.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
const app = await NestFactory.create(AppModule);
// Starts listening to shutdown hooks
app.enableShutdownHooks();
await app.listen(3000);
}
bootstrap();

Chú ý là khi một application bị shutdown nó gửi một signal đến hàm onApplicationShutdown. Trong trường hợp, hàm onApplicationShutdown trả về một Promise thì application sẽ không shutdown cho đến khi Promise hoàn tất.

import { Module,OnApplicationShutdown} from '@nestjs/common';

@Module({})
export class AppModule implements OnApplicationShutdown{
onApplicationShutdown(sigal: string) {
console.log(`The application has been détroyed ${signal}.`);
}
}

Cả 4 hàm trên đều có thể implement trong các provider và nhận được event thông qua injection nên chúng ta có thể implement trong module, hoặc service đều được.

--

--