Rate this post

Node.js là một nền tảng mạnh mẽ và phổ biến cho việc phát triển các ứng dụng web và máy chủ. Trong số các framework nổi bật của Node.js, NestJS được biết đến với khả năng xây dựng các ứng dụng server-side mạnh mẽ, linh hoạt và có cấu trúc rõ ràng. Bài viết này sẽ cung cấp cái nhìn tổng quan về NestJS, lợi ích và ứng dụng của nó trong việc phát triển các ứng dụng Node.js.

NestJS là gì?

NestJS là một framework để xây dựng các ứng dụng Node.js hiệu suất cao, có cấu trúc module hóa rõ ràng. Được xây dựng dựa trên TypeScript, NestJS sử dụng các khái niệm từ các framework phổ biến như Angular để tạo ra một hệ thống có khả năng mở rộng cao. Kiến trúc của NestJS bao gồm các thành phần chính như Modules, Controllers, Providers, và Middleware, giúp quản lý và tổ chức mã nguồn một cách hiệu quả.

Lợi ích của việc sử dụng NestJS

Kiến trúc module hóa

NestJS cung cấp kiến trúc module hóa, giúp chia ứng dụng thành các module nhỏ dễ quản lý và bảo trì. Điều này giúp cải thiện sự phân chia nhiệm vụ và tăng khả năng mở rộng của ứng dụng.

Hỗ trợ TypeScript

NestJS được xây dựng dựa trên TypeScript, mang lại lợi ích về kiểm tra kiểu tĩnh và tăng cường khả năng bảo trì mã nguồn. TypeScript giúp phát hiện lỗi sớm trong quá trình phát triển, từ đó giảm thiểu rủi ro khi triển khai.

Tính mở rộng và tích hợp

NestJS dễ dàng tích hợp với các thư viện và framework khác, giúp bạn có thể mở rộng chức năng của ứng dụng một cách dễ dàng. Bạn có thể sử dụng các module có sẵn hoặc tự xây dựng các module tùy chỉnh theo nhu cầu.

Cài đặt và thiết lập dự án NestJS

Cài đặt NestJS CLI

Để bắt đầu với NestJS, trước tiên bạn cần cài đặt công cụ dòng lệnh của NestJS:

npm install -g @nestjs/cli

Khởi tạo dự án mới

Sau khi cài đặt xong NestJS CLI, bạn có thể tạo một dự án NestJS mới bằng lệnh:

nest new project-name

Lệnh này sẽ tạo ra một dự án NestJS với cấu trúc thư mục và các tệp cấu hình cần thiết.

Cấu trúc dự án

Cấu trúc thư mục của một dự án NestJS điển hình bao gồm các thư mục như src (chứa mã nguồn), dist (chứa mã nguồn đã biên dịch), và các tệp cấu hình như nest-cli.json, tsconfig.json, và package.json.

Các thành phần chính trong NestJS

Modules

Modules là thành phần cốt lõi trong NestJS, giúp tổ chức mã nguồn thành các phần có thể tái sử dụng. Mỗi module là một lớp có chứa các service, controller, và các module khác.

Ví dụ

import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

Controllers

Controllers chịu trách nhiệm xử lý các yêu cầu HTTP và trả về phản hồi cho client. Chúng thường sử dụng các service để thực hiện logic nghiệp vụ.

Ví dụ

import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }
}

Providers

Providers cung cấp các dịch vụ và logic nghiệp vụ trong ứng dụng. Chúng được quản lý thông qua hệ thống Dependency Injection của NestJS.

Ví dụ

import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  private readonly users = [];

  findAll() {
    return this.users;
  }
}

Middleware

Middleware là các hàm trung gian được gọi trước khi controller xử lý yêu cầu. Chúng thường được sử dụng để xác thực, ghi log, và xử lý lỗi.

Ví dụ

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(`Request...`);
    next();
  }
}

Kết nối cơ sở dữ liệu với NestJS

Thiết lập kết nối

NestJS hỗ trợ kết nối với nhiều loại cơ sở dữ liệu khác nhau thông qua các module như TypeORM, Mongoose, Sequelize. Dưới đây là cách kết nối với PostgreSQL sử dụng TypeORM:

import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'test',
      password: 'test',
      database: 'test',
      entities: [__dirname + '/../**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

Sử dụng TypeORM

TypeORM là một ORM cho TypeScript và JavaScript (ES7), hỗ trợ nhiều cơ sở dữ liệu khác nhau. Dưới đây là cách tạo một entity và repository trong NestJS:

Entity

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  age: number;
}

Repository

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }

  findOne(id: number): Promise<User> {
    return this.usersRepository.findOne(id);
  }

  async remove(id: number): Promise<void> {
    await this.usersRepository.delete(id);
  }
}

Bảo mật trong NestJS

Authentication và Authorization

NestJS cung cấp các công cụ để thực hiện xác thực và phân quyền người dùng, giúp bảo vệ các API của bạn.

Sử dụng Passport

Passport.js là một middleware phổ biến để xác thực người dùng trong Node.js. Dưới đây là cách tích hợp Passport.js với NestJS:

Cài đặt Passport

npm install @nestjs/passport passport passport-local

Sử dụng Passport

import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { AuthService } from './auth.service';
import { LocalStrategy } from './local.strategy';

@Module({
  imports: [PassportModule],
  providers: [AuthService, LocalStrategy],
})
export class AuthModule {}

Xây dựng hệ thống đăng nhập cơ bản với JWT

Cài đặt JWT

npm install @nestjs/jwt passport-jwt

Sử dụng JWT

import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { AuthService } from './auth.service';
import { JwtStrategy } from './jwt.strategy';

@Module({
  imports: [
    JwtModule.register({
      secret: 'secretKey',
      signOptions: { expiresIn: '60s' },
    }),
  ],
  providers: [AuthService, JwtStrategy],
})
export class AuthModule {}

Thực hành tốt nhất khi phát triển với NestJS

Quản lý cấu trúc dự án

Tổ chức và quản lý cấu trúc dự án hợp lý giúp dự án dễ dàng mở rộng và bảo trì. Sử dụng các module để chia nhỏ các phần của ứng dụng.

Kiểm thử

Thực hành kiểm thử đơn vị và kiểm thử tích hợp trong NestJS để đảm bảo chất lượng mã nguồn. Sử dụng các công cụ như Jest để viết và chạy các bài kiểm thử.

Quản lý cấu hình

Sử dụng các phương pháp quản lý cấu hình trong NestJS để dễ dàng thay đổi các thiết lập của ứng dụng mà không cần sửa đổi mã nguồn.

Các trường hợp sử dụng thực tế

Ứng dụng web

Xây dựng một ứng dụng web cơ bản với NestJS, sử dụng các module, controller và service để quản lý luồng dữ liệu.

API RESTful

Xây dựng một API RESTful với NestJS, sử dụng các phương thức HTTP và middleware để xử lý các yêu cầu và phản hồi.

Microservices

Sử dụng NestJS để xây dựng các microservices, tận dụng khả năng module hóa và tích hợp với các hệ thống khác.

Kết luận

NestJS là một framework mạnh mẽ và linh hoạt cho việc phát triển các ứng dụng Node.js. Với kiến trúc module hóa, hỗ trợ TypeScript và tính năng mở rộng, NestJS giúp các lập trình viên xây dựng các ứng dụng server-side hiệu quả và dễ bảo trì. Bằng cách áp dụng các thực hành tốt nhất và hiểu rõ các thành phần của NestJS, bạn có thể phát triển các ứng dụng mạnh mẽ và đáng tin cậy.

Tham khảo

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now