0
0
Lập trình
TT

Hướng Dẫn Học NestJS Căn Bản Cho Lập Trình Viên Ruby on Rails

Đăng vào 2 tuần trước

• 4 phút đọc

Chủ đề:

nestjs

Giới Thiệu

Ai Là Người Viết Bài Này?

Mình là một lập trình viên Backend chuyên về Ruby on Rails (ROR), với nhiều năm kinh nghiệm làm việc và phát triển ứng dụng. Ngoài ROR, đôi khi mình cũng sử dụng các ngôn ngữ khác như Python và Node.js để tạo ra những công cụ nhỏ cho dự án cá nhân của mình. Công việc hàng ngày chủ yếu liên quan đến xử lý logic, API và truy vấn dữ liệu, do đó mình ít khi làm việc với JavaScript, chỉ thường sử dụng jQuery và AJAX.

Trước xu hướng phổ biến của thị trường công nghệ hiện nay, để đáp ứng nhu cầu của các dự án mới, mình quyết định học về NestJS. Bài viết này mình muốn chia sẻ những kinh nghiệm và hiểu biết của bản thân về NestJS từ góc nhìn của một lập trình viên ROR. Mục tiêu là tìm ra những điểm tương đồng giữa NestJS và ROR để việc học của chúng ta trở nên dễ dàng và gần gũi hơn.

NestJS Là Gì?

NestJS là một framework mã nguồn mở trên nền tảng Node.js, được thiết kế để phát triển ứng dụng phía server. Framework này sử dụng TypeScript, giúp làm cho việc xây dựng các hệ thống phụ trợ trở nên linh hoạt và hiệu quả. NestJS cũng hỗ trợ nhiều loại cơ sở dữ liệu như MongoDB, MySQL và nhiều hơn nữa. Chi tiết hơn về NestJS có thể tham khảo tại đây.

Các Khái Niệm Cơ Bản Trong NestJS

Trong bài viết này, mình sẽ trình bày một số khái niệm quan trọng như Controller, Module, Service, Provider, Middleware, Guards, IOC, Inject và Repository.

Controller, Module, Service, Provider, Repository

Luồng Quan Hệ Và Khái Niệm IOC

Để dễ hình dung hơn về mối quan hệ giữa các thành phần trong NestJS, mình sẽ giải thích ngắn gọn như sau:

  • Controller: Là nơi nhận yêu cầu từ Client, xử lý logic và phản hồi lại. Ví dụ: khi có một yêu cầu từ Client, Controller sẽ gọi đến Service để xử lý và cuối cùng trả kết quả cho Client.
  • Service: Là nơi chứa các logic ứng dụng, xử lý dữ liệu mà Controller yêu cầu. Service giúp tách biệt logic ra khỏi Controller, từ đó dễ quản lý hơn.
  • Module: Được thiết kế để đóng gói các thành phần liên quan đến một chức năng cụ thể, trong đó định nghĩa các thuộc tính như Controller và Provider.
  • Provider: Là khái niệm tổng quát, bao gồm cả Services, Controllers, Factories và những thành phần khác.
  • Repository: Tương tự như Model trong ROR, nó chịu trách nhiệm thực hiện các tác vụ liên quan đến cơ sở dữ liệu.

Ví Dụ Cụ Thể Về Controller, Service Và Module

Dưới đây là ví dụ về cách viết mã cho một ứng dụng quản lý thú cưng trong NestJS:

typescript Copy
// cats.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class CatsService {
 private readonly cats: string[] = [];
 create(cat: string) {
   this.cats.push(cat);
 }
 findAll(): string[] {
   return this.cats;
 }
}
typescript Copy
// cats.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { CatsService } from './cats.service';
@Controller('cats')
export class CatsController {
 constructor(private readonly catsService: CatsService) {}
 @Post()
 create(@Body() catDto: { name: string }) {
   this.catsService.create(catDto.name);
 }
 @Get()
 findAll(): string[] {
   return this.catsService.findAll();
 }
}
typescript Copy
// cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
 controllers: [CatsController],
 providers: [CatsService],
})
export class CatsModule {}

Phân Tích Mối Quan Hệ Giữa Các Thành Phần

  • Controller: Nhận và xử lý yêu cầu từ Client.
  • Service: Thực hiện các logic và cung cấp dữ liệu cho Controller.
  • Module: Đóng gói và khai báo các thành phần. Mỗi Module thường có một hoặc nhiều Controllers và Services theo một chức năng nhất định.
  • Mối quan hệ giữa các thành phần này dựa trên quy tắc IOC (Inversion of Control), giúp tăng cường tính linh hoạt và dễ dàng quản lý trong phát triển ứng dụng.

Repository Trong NestJS

Repository trong NestJS tương tự như Model trong Ruby on Rails với những điểm khác biệt sau đây:

  • Repository có thể triển khai độc lập với ORM và hỗ trợ các truy vấn SQL trực tiếp.
  • Model trong Ruby on Rails thường liên kết chặt chẽ với ORM giúp việc thao tác với cơ sở dữ liệu trở nên dễ dàng hơn.

Chia Sẻ Service Qua Exports Module

Để cho các Module khác có thể sử dụng Service bên trong, chúng ta cần Export Service trong Module:

typescript Copy
@Module({
 imports: [],
 controllers: [CatsController],
 providers: [CatsService],
 exports: [CatsService],
})
export class CatsModule {}

Middleware Và Guards

Middleware và Guards trong NestJS khá giống với các khái niệm trước_action, Authorization trong Ruby on Rails.

Middleware

Middleware cho phép thực hiện các tác vụ trước khi yêu cầu được xử lý bởi Controller. Ví dụ, có thể xác thực token trước khi cho phép truy cập vào một endpoint.

Guards

Guards được sử dụng để kiểm tra quyền truy cập người dùng trước khi thực hiện bất kỳ yêu cầu nào. Ví dụ:

typescript Copy
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class AuthGuard implements CanActivate {
 canActivate(context: ExecutionContext): boolean {
   const request = context.switchToHttp().getRequest();
   return isAuthenticated && hasAccess;
 }
}

Kết Luận

Học một ngôn ngữ lập trình mới từ góc nhìn của những điều đã biết sẽ giúp chúng ta hiểu rõ hơn về bản chất của nó. Mặc dù có nhiều điểm khác biệt giữa NestJS và ROR, nhưng nếu biết liên hệ và tìm điểm chung, việc học sẽ trở nên thú vị hơn.

Hy vọng bài viết này sẽ là nguồn tài liệu hữu ích cho những ai đang bắt đầu học NestJS như mình!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào