· nodejs nestjs · 11 min read

Giới thiệu NestJS

NestJS là framework backend dùng TypeScript, ra mắt năm 2017, lấy cảm hứng từ Angular. Nó hỗ trợ kiến trúc module hóa, giúp ứng dụng dễ mở rộng, kiểm thử và bảo trì, đồng thời nổi bật nhờ khả năng tổ chức kiến trúc server hiệu quả.

NestJS là framework backend dùng TypeScript, ra mắt năm 2017, lấy cảm hứng từ Angular. Nó hỗ trợ kiến trúc module hóa, giúp ứng dụng dễ mở rộng, kiểm thử và bảo trì, đồng thời nổi bật nhờ khả năng tổ chức kiến trúc server hiệu quả.

Giới thiệu về Seri

Mình thực hiện series nhằm mục đích hệ thống lại kiến thức của bản thân, và hơn nữa là mình muốn giúp các bạn mới bắt đầu với NestJS có thể dễ dàng nắm vững những khía cạnh cơ bản nhất của một dự án NestJS. Hy vọng sẽ giúp ích được cho các bạn.

Chuỗi này gồm 7 phần, mình sẽ đi lần lượt từng phần như sau:

  1. Hướng dẫn Setup project NestJS và kiểm tra API cơ bản
    Khởi đầu bằng cách cài đặt và cấu hình một dự án NestJS, cùng với việc kiểm tra các API cơ bản để đảm bảo mọi thứ hoạt động trơn tru.

  2. Setup Swagger cho project
    Cấu hình Swagger để tự động tạo tài liệu API, giúp bạn dễ dàng quản lý, kiểm tra và chia sẻ các endpoint của ứng dụng.

  3. Setup TypeORM Database
    Kết nối và quản lý cơ sở dữ liệu với TypeORM, một ORM mạnh mẽ dành cho TypeScript và JavaScript, từ việc định nghĩa entity đến thực hiện các truy vấn cơ bản.

  4. Hướng dẫn Setup Authentication
    Xây dựng hệ thống xác thực (authentication) với các tính năng như đăng ký, đăng nhập, và bảo mật API bằng JWT (JSON Web Token).

  5. Setup MemoryBank cho project (sử dụng RooCode)
    Tích hợp MemoryBank – có thể là một cơ chế lưu trữ dữ liệu in-memory – vào dự án, tận dụng công cụ RooCode để tối ưu hóa hiệu suất.

  6. Quiz Project Demo
    Áp dụng tất cả kiến thức đã học để xây dựng một dự án demo thực tế – một ứng dụng quiz – kết hợp API, cơ sở dữ liệu, và xác thực.

  7. Development on Cloud
    Kết thúc bằng cách triển khai ứng dụng lên cloud, bao gồm các bước thiết lập môi trường cloud và quản lý ứng dụng trong thực tế.

Với lượng kiến thức như trên, thì sau khi hoàn thành chuỗi seri bạn sẽ có đủ trang bị để tạo một ứng dụng NestJS cơ bản.

Trong bài viết đầu tiên này, chúng ta sẽ bắt đầu với phần 1 cũng như làm quen với NestJS, nội dung chủ yếu như sau:

Bước 1: Cài đặt Node.js và Node Package Manager (NPM)
Bước 2: Cài đặt NestJS CLI
Bước 3: Tạo dự án NestJS tự động với NestJS CLI
Bước 4: Tìm hiểu về cấu trúc thư mục và chức năng của các file liên quan
Bước 5: Khởi chạy ứng dụng
Bước 6: Kiểm tra vận hành hệ thống

Bước 1: Cài đặt Node.js và Node Package Manager (NPM)

Trước khi bắt đầu dự án với Nest, bạn cần đảm bảo rằng máy của bạn đã cài đặt Node.jsnpm.
Với Node.js, mình khuyên bạn nên cài đặt phiên bản LTS mới nhất hoặc tối thiểu là phiên bản 20 LTS để đảm bảo tương thích tốt nhất với NestJS.

Để kiểm tra xem máy bạn đã cài đặt chưa cũng như xem phiên bản đã cài đặt thì bạn nhập lệnh sau trong của sổ command-line:

node -v   # Kiểm tra phiên bản Node.js
npm -v    # Kiểm tra phiên bản của npm

node_npm_check_version.png Nếu bạn chưa nhận được thông báo phiên bản khi kiểm tra bằng lệnh node -v hoặc npm -v, rất có thể máy của bạn chưa được cài đặt Node.js. Bạn có thể truy cập vào trang chính thức Node.JS để tải về phiên bản phù hợp và tiến hành cài đặt.
Trong trường hợp bạn đã cài đặt nhưng vẫn gặp lỗi, nguyên nhân có thể là do biến môi trường (environment variable) cho Node chưa được thiết lập đúng. Hãy kiểm tra lại phần cấu hình PATH để đảm bảo hệ điều hành có thể nhận diện được lệnh node và npm từ bất kỳ đâu trong command-line.


Bước 2: Cài đặt NestJS CLI

Nest CLI (Command Line Interface) là công cụ dòng lệnh chính thức do NestJS cung cấp, nó chứa hầu hết các lệnh giúp tự động hoá hầu hết các thao tác, vì vậy mà nó giúp tăng tốc quá trình phát triển, giảm lỗi khi tạo thủ công, cũng như đảm bảo tính đồng nhất về cấu trúc cho mọi dự án NestJS. Với Nest CLI chúng ta có thể:

  • Khởi tạo project NestJS mới (nest new)

  • Tạo nhanh các thành phần (module, controller, service…) bằng lệnh (nest g)

  • Tích hợp test, build, lint dễ dàng

  • Quản lý cấu trúc dự án theo chuẩn kiến trúc Nest

Cài đặt Nest CLI: để tiền hành cài đặt, bạn mở Command-line và chạy lệnh:

npm install -g @nestjs/cli

Với lệnh trên, Nest CLI sẽ được cài đặt vào hệ thống toàn cục, bạn có thể sử dụng nó ở bất kì đâu chứ không chỉ trong thư mục dự án.

Để chắc chắn rằng Nest CLI đã được cài đặt, bạn cũng thực hiện kiểm tra thông qua lệnh:

nest -v

nest_check_version.png

Tương tự như ở bước 1, nếu nhận được thông báo về version thì bạn đã cài đặt thành công còn ngược lại thì phần lớn nguyên nhân là do Nest chưa được thêm vào biến môi trường. Bạn thử kiểm tra lại nhé.

Bước 3: Tạo dự án NestJS tự động với NestJS CLI

Sau các bước chuẩn bị thì giờ chúng ta bắt đầu tạo một dự án mới. Với NestJS, khi thực hiện khởi tạo dự án mới, bạn chỉ cần quan tâm đến tên dự ántrình quản lý package , Nest CLI sẽ đảm nhiệm hết vai trò khởi tạo cấu trúc dự án cho bạn.

Bắt đầu bạn cần mở Command-line tại thư mục muốn tạo dự án, thao tác này giúp định vị vị trí lưu trữ cho dự án. Sau đó chạy lệnh:

nest new Quiz
  • Trong đó: Quiz là tên của dự án mà bạn muốn đặt.

creation_project Nest CLI sẽ hỏi bạn trình quản lý package cho dự án của bạn là gì. Ở đây mình dùng npm. Ngoài ra bạn có thể chọn yarn hoặc pnpm tuỳ vào nhu cầu và mục đích sử dụng.
Sau khi chọn xong thì Nest CLI sẽ yêu cầu bạn chờ đợi để thực hiện tạo một thư mục dự án mới, sau gần một phút chúng ta có kết quả: project_installed
Vậy là chúng ta đã hoàn thành việc tạo một dự án mới một cách tự động thông qua Nest CLI. Bước kế tiếp chúng ta sẽ tìm hiểu xem chức năng của các file và thư mục liên quan trong thư mục dự án vừa tạo.

Bước 4: Tìm hiểu về cấu trúc thư mục và chức năng của các file liên quan

Thư mục dự án vừa tạo cơ bản sẽ có cấu trúc nhau sau:

Quiz/
├── node_modules/                  # 📦 Thư viện phụ thuộc

├── src/                           # 🧠 Mã nguồn chính của ứng dụng
│   ├── app.controller.spec.ts     # Unit test cho controller
│   ├── app.controller.ts          # Controller chính – xử lý route
│   ├── app.module.ts              # Root module – khai báo controller & service
│   ├── app.service.ts             # Business logic cơ bản
│   └── main.ts                    # Entry point khởi chạy ứng dụng

├── test/                          # 🧪 Thư mục chứa E2E test
│   └── app.e2e-spec.ts            # Mẫu e2e test
│   └── jest-e2e.json              # Cấu hình Jest riêng cho e2e

├── .eslintrc.js                   # Cấu hình ESLint (lint code theo chuẩn)
├── .prettierrc                    # Cấu hình Prettier (format code)
├── .gitignore                     # Bỏ qua file/thư mục khi commit
├── nest-cli.json                  # Cấu hình cho Nest CLI
├── package.json                   # Quản lý dependency & script npm
├── tsconfig.build.json            # TypeScript config cho bước build
├── tsconfig.json                  # TypeScript config chính
└── README.md                      # Thông tin giới thiệu dự án

Nhìn thì có vẻ khá phức tạp, nhưng đừng quá lo lắng. Vì thực ra, sẽ có những file và thư mục được NestJS tự động cập nhật, chúng ta không hề thao tác đến nó. Mình sẽ làm rõ một số thư mục cũng như file quan trọng để hiểu rõ hơn chức năng của chúng. Đầu tiên là các file ngoài cùng, chúng ta có:

  • package.json: quản lý phụ thuộc (dependencies) và các script như start, build, test…

  • nest-cli.json: cấu hình riêng cho Nest CLI.

  • .eslintrc.js: cấu hình ESLint – công cụ kiểm tra lỗi và chuẩn hóa phong cách viết mã. Bạn có thể chỉnh lại theo quy chuẩn nhóm.

  • tsconfig.json: cấu hình TypeScript – gồm các tùy chọn biên dịch như bật strict mode, module resolution, và thư mục đầu ra.

Tiếp đến là các thư mục, ở đây chúng ta có 3 thư mục là node_modules, testsrc:

  • node_modules: chứa các dependencies của dự án.

  • test: lưu trữ các file end-to-end test.

  • src: chứa các file cốt lõi của hệ thống. Trong khuôn khổ phần này mình sẽ không đi sâu vào node_moduletest mà mình sẽ chỉ làm rõ thư mục src.

Bên trong thư mục src/, bạn sẽ thấy:

  • main.ts: Điểm khởi đầu của ứng dụng của bạn.

  • app.controller.ts: Xử lý các yêu cầu HTTP đến, định nghĩa các route và quản lý vòng đời request-response cho ứng dụng của bạn.

  • app.service.ts: Một service cơ bản với một phương thức đơn lẻ.

  • app.module.ts: Module gốc (root module) của ứng dụng.

  • app.controller.spec.ts: chứa file unit-test cho module liên quan.

File main.ts đóng vai trò là điểm khởi đầu cho ứng dụng của chúng ta. Nó chịu trách nhiệm khởi động server và thiết lập để server lắng nghe trên một cổng cụ thể. Trong ví dụ file main.ts bên dưới, mình dùng toán tử ?? cho việc khai báo cổng cho ứng dụng, nếu giá trị process.env.PORT là null hoặc undefined, tức là không được khai báo thì 3000 sẽ là cổng mặc định, bạn có thể thay đổi cổng này để phù hợp với cấu trúc hệ thống.

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

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();

Bước 5: Khởi chạy ứng dụng

Sau khi tìm hiểu các thành phần trong thư mục dự án, giờ chúng ta đã sẵn sàng cho việc khởi chạy nó. Để chạy dự án, bạn cần đảm bảo bạn đang ở command-line của thư mục dự án, và chạy dòng lệnh:

npm run start

Ngoài npm run start bạn có thể cân nhắc dùng npm run start:dev vì với lệnh này, bạn có thể xem được trực tiếp các chỉnh sửa phát sinh kể từ khi bắt đầu khởi chạy, nó rõ hơn là với lệnh trên, khi dự án đang chạy, mà source code của bạn có bất kì thay đổi nào thì nó sẽ được tự động chạy lại để đảm bảo cập nhật mới nhất.

run_app_nestjs

Hình trên là kết quả mà bạn sẽ nhận được khi chạy lệnh đề cập bên trên, bạn để ý dòng cuối bên trái có thông tin Nest application successfully started. Với thông báo này, ứng dụng của bạn đã được khởi động, và đang chờ request đến từ cổng mà chúng ta đã thiết lập trước đó. Chúng ta sẽ chuyển sang bước 6 để kiểm tra kết quả.

Bước 6: Kiểm tra vận hành hệ thống

Để bắt đầu chúng ta cần một Web Browser, ở đây mình dùng Google Chorme. Tại thanh địa chỉ bạn điền http://localhost:3000 và tiến hành truy cập.
Về cơ bản thao tác trên yêu cầu web browser gửi một GET request đến http://localhost tại cổng 3000, cùng lúc đó thì ứng dụng đã được khởi động ở bước 5 đang sẵn sàng tiếp nhận các request tại cổng 3000. Ngay lập tức chúng ta nhận được kết quả như hình bên dưới:

test_app_with_browser Hello World! là phản hồi từ ứng dụng, khi ta gửi request trên. Điều này đánh dấu thành quả học tập của chúng ta từ đầu đến giờ.

Tổng kết

Vậy là chúng ta đã hoàn thành xong phần đầu tiên của chuỗi series. Ở phần tiếp theo, chúng ta sẽ cùng nhau tìm hiểu cách thiết lập Swagger cho dự án NestJS. Đây là một công cụ cực kỳ hữu ích, không chỉ hỗ trợ kiểm thử API mà còn cung cấp giao diện trực quan và tài liệu mô tả rõ ràng cho từng endpoint — từ input cho đến output. Việc tích hợp Swagger sẽ giúp chúng ta dễ dàng mở rộng, bảo trì và cộng tác trong quá trình phát triển ứng dụng.

Back to Blog