Hướng dẫn dùng NestJS và TypeORM tương tác Database

3 min read

Giới thiệu

Một trong những ưu điểm của NestJS là khả năng tích hợp dễ dàng với các ORM (Object-Relational Mapping) như TypeORM. TypeORM là một ORM cho TypeScript và JavaScript, cho phép bạn làm việc với các cơ sở dữ liệu quan hệ một cách thuận tiện và linh hoạt. Trong bài viết này, tôi sẽ hướng dẫn tìm hiểu cách sử dụng TypeORM với MySQL trong ứng dụng NestJS.

Hướng dẫn

1. Cài đặt TypeOrm
Cài đặt TypeOrm và các package liên quan, bạn có thể sử dụng npm, yarn hoặc pnpm tùy ý, ở đây mình sử dụng npm cho phổ biến:

npm install --save @nestjs/typeorm typeorm mysql2

2. Tích hợp TypeOrm
Bên trong app.module.ts, bạn cần import và cấu hình TypeORM module trực tiếp trong mã nguồn:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './user/user.module';
import { User } from './user/user.entity';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'password',
      database: 'test_db',
      entities: [User],
      synchronize: true,
    }),
    UserModule,
  ],
})
export class AppModule {}

3. Hướng dẫn tạo Entity
Khi đã xong phần cấu hình, chúng ta sẽ tạo ra một User entity trong thư mục user

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

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

  @Column()
  name: string;

  @Column()
  email: string;
}

4. Tạo Repository, Service và Controller
Sử dụng repository để tương tác với cơ sở dữ liệu thông qua entity. Tạo các file user.service.tsuser.controller.ts trong thư mục user:
user.service.ts:

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.findOneBy({ id });
  }

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

user.controller.ts:

import { Controller, Get, Param, Delete } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  findAll(): Promise<User[]> {
    return this.userService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: number): Promise<User> {
    return this.userService.findOne(id);
  }

  @Delete(':id')
  remove(@Param('id') id: number): Promise<void> {
    return this.userService.remove(id);
  }
}

5. Hướng dẫn tạo UserModule
Đảm bảo rằng bạn đã đăng ký các thành phần trong module của bạn (user.module.ts):

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UserService } from './user.service';
import { UserController } from './user.controller';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UserService],
  controllers: [UserController],
})
export class UserModule {}

Ưu điểm

  1. Dễ sử dụng và tích hợp: TypeORM tích hợp dễ dàng với NestJS, giúp việc cấu hình và sử dụng trở nên đơn giản.
  2. Hỗ trợ TypeScript: TypeORM được viết bằng TypeScript, cung cấp các tính năng mạnh mẽ và hỗ trợ tốt cho lập trình viên.
  3. Đa cơ sở dữ liệu: TypeORM hỗ trợ nhiều loại cơ sở dữ liệu như MySQL, PostgreSQL, SQLite, và hơn thế nữa.
  4. Migration: TypeORM cung cấp công cụ migration để quản lý thay đổi trong cấu trúc cơ sở dữ liệu.

Nhược Điểm

  1. Hiệu năng: Đối với các ứng dụng lớn với lượng truy vấn phức tạp, ORM có thể không tối ưu bằng các giải pháp truy vấn thủ công.
  2. Học tập và cấu hình: Ban đầu, việc học và cấu hình TypeORM có thể gây khó khăn cho những người mới bắt đầu.
  3. Giới hạn: Một số tính năng của cơ sở dữ liệu không được hỗ trợ hoàn toàn bởi TypeORM.

Kết luận

Kết luận, việc sử dụng TypeORM trong NestJS với MySQL mang lại nhiều lợi ích về mặt phát triển và bảo trì ứng dụng. Dù có một số nhược điểm, nhưng với sự hỗ trợ mạnh mẽ từ cộng đồng và các tài liệu phong phú, TypeORM vẫn là một lựa chọn tuyệt vời cho các dự án NestJS.

Ngoài hướng dẫn này ra bạn có thể tham khảo docs của NestJS, hoặc kho tàng kiến thức IT Viblo để hiểu rõ hơn về TypeOrm cũng như NestJS nhé

https://docs.nestjs.com/techniques/database
https://viblo.asia/p/nestjs-xay-dung-project-tich-hop-typeorm-repository-pattern-Eb85o9VBZ2G
Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *