Tạo và chạy dự án NestJS trên macOS với ServBay
NestJS là một framework Node.js tiên tiến dùng để xây dựng các ứng dụng backend hiệu quả và có khả năng mở rộng cao. Framework này được viết bằng TypeScript, lấy cảm hứng từ Angular, sử dụng kiến trúc mô-đun và mô hình dependency injection (DI). NestJS cung cấp hàng loạt công cụ mạnh mẽ, giúp lập trình viên dễ dàng phát triển các ứng dụng phức tạp có tính bảo trì cao, dễ kiểm thử và ít phụ thuộc lẫn nhau.
Ưu điểm nổi bật của NestJS
- Kiến trúc mô-đun: Tổ chức mã nguồn theo mô-đun giúp ứng dụng cấu trúc tốt, dễ quản lý và bảo trì.
- Dependency injection: Cung cấp hệ thống DI mạnh mẽ, dễ sử dụng, làm tăng khả năng kiểm thử và bảo trì của code.
- Sử dụng TypeScript: Tận dụng kiểm tra kiểu tĩnh, interface và các tính năng mới của JavaScript hiện đại, giúp tăng hiệu suất phát triển và chất lượng code, giảm lỗi runtime.
- Trang bị các decorator đa dạng: Sử dụng decorator để định nghĩa controller, service, module,... làm code ngắn gọn, rõ ràng và trực quan hơn.
- Hệ sinh thái phong phú: Cộng đồng đông đảo, nhiều module/plugin bên thứ ba; dễ dàng tích hợp các tính năng phổ biến như TypeORM, Mongoose, GraphQL, WebSockets, cache, validation,...
- Dựa trên chuẩn: Xây dựng dựa trên Express hoặc Fastify - các web server đã được chứng thực về hiệu năng và độ ổn định.
NestJS cho phép lập trình viên áp dụng các best practices (như SOLID, design pattern) trong lập trình backend để nhanh chóng xây dựng ứng dụng web, API, microservices hiệu suất cao, quy mô doanh nghiệp.
Tạo và chạy dự án NestJS với ServBay
ServBay mang đến một môi trường phát triển web local mạnh mẽ và tích hợp cho macOS, gồm nhiều phiên bản Node.js, các cơ sở dữ liệu và web server phổ biến. Hướng dẫn này sẽ sử dụng môi trường Node.js và tính năng "Website" (Websites) của ServBay để tạo, cấu hình và chạy một dự án NestJS. Với tính năng reverse proxy của ServBay, bạn còn có thể truy cập ứng dụng NestJS của mình bằng tên miền tùy chỉnh trên chính máy Mac của bạn.
Điều kiện cần
Trước khi bắt đầu, hãy đảm bảo bạn đã hoàn tất các bước sau:
- Cài đặt ServBay: Đã cài đặt thành công ServBay trên macOS.
- Kích hoạt gói Node.js: Trong tab "Packages" của ServBay, hãy chọn và cài đặt phiên bản Node.js bạn cần. Nếu chưa làm, hãy tham khảo Hướng dẫn sử dụng Node.js với ServBay.
Tạo dự án NestJS
Cài đặt NestJS CLI toàn cục
Mở Terminal và sử dụng npm (được cài kèm Node.js) để cài đặt công cụ CLI của NestJS:
bashnpm install -g @nestjs/cli
1Khởi tạo dự án
Di chuyển đến thư mục gốc website mặc định của ServBay tại
/Applications/ServBay/www
. Nên đặt dự án tại đây để tiện cấu hình website. Tạo dự án mới với CLI:bashcd /Applications/ServBay/www nest new servbay-nest-app
1
2Quá trình khởi tạo sẽ hướng dẫn bạn lựa chọn trình quản lý package (npm, yarn hoặc pnpm). Nên chọn npm để đồng nhất. Dự án sẽ nằm tại
/Applications/ServBay/www/servbay-nest-app
.Cài đặt các phụ thuộc
Đi vào thư mục dự án vừa tạo
servbay-nest-app
rồi cài đặt các package cần thiết:bashcd servbay-nest-app npm install
1
2Lệnh
nest new
đã chạy sẵnnpm install
. Tuy vậy, chạy lại sẽ giúp chắc chắn mọi phụ thuộc đều được cài mới nhất.
Thay đổi nội dung phản hồi của dự án NestJS (tuỳ chọn)
Để kiểm tra dự án đã chạy thành công và truy cập được từ ServBay, bạn có thể sửa phản hồi mặc định của route gốc.
Chỉnh sửa file
src/app.controller.ts
Dùng editor bạn thích mở file
src/app.controller.ts
trong dự án và sửa như sau, để khi truy cập đường dẫn/
sẽ trả về chuỗi "Hello ServBay!":typescriptimport { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; // Nếu bạn giữ lại AppService @Controller() export class AppController { constructor(private readonly appService: AppService) {} // Nếu giữ AppService @Get() getHello(): string { // return this.appService.getHello(); // Nếu dùng AppService return 'Hello ServBay!'; // Trả về chuỗi trực tiếp } }
1
2
3
4
5
6
7
8
9
10
11
12
13Đoạn code này định nghĩa một Controller đơn giản, xử lý request GET đến
/
và trả về chuỗi chỉ định.
Chạy dự án NestJS ở chế độ phát triển và truy cập qua ServBay
Thông thường, dự án NestJS sẽ chạy với dev server nội bộ, lắng nghe một cổng nhất định. Sau đó, bạn có thể cấu hình reverse proxy trong ServBay để ánh xạ tên miền tùy chỉnh về cổng server đang chạy này.
Khởi động server phát triển
Tại thư mục gốc của dự án
/Applications/ServBay/www/servbay-nest-app
, chạy lệnh sau để bật NestJS dev server. Đặt biến môi trườngPORT
(vd:8585
):bashcd /Applications/ServBay/www/servbay-nest-app PORT=8585 npm run start:dev
1
2npm run start:dev
là script mặc định của NestJS để chạy bằngts-node
và theo dõi thay đổi file, tự restart server. Server sẽ lắng nghe tạilocalhost:8585
.Cấu hình reverse proxy trong ServBay
Mở bảng điều khiển ServBay, chuyển đến tab "Websites" rồi bấm nút thêm mới (
+
):- Tên (Name): Đặt tên dễ nhận biết, ví dụ
My first NestJS dev site
. - Tên miền (Domains): Nhập tên miền local mong muốn, ví dụ
servbay-nest-test.dev
. ServBay hỗ trợ sẵn phân giải đuôi.dev
về local, không cần sửa file hosts. - Loại (Type): Chọn
Reverse Proxy
. - Địa chỉ IP (IP Address): Nhập IP lắng nghe của Node.js app, thông thường là
127.0.0.1
. - Cổng (Port): Nhập cổng mà app NestJS đang chạy, ở đây là
8585
.
Nhấn lưu để hệ thống tự cập nhật cấu hình web server (Caddy hoặc Nginx). Xem thêm chi tiết tại Tài liệu thêm website với ServBay.
- Tên (Name): Đặt tên dễ nhận biết, ví dụ
Truy cập website ở chế độ phát triển
Mở trình duyệt và vào tên miền bạn vừa thiết lập
https://servbay-nest-test.dev
.Lưu ý:
- ServBay tự động cấp chứng chỉ SSL miễn phí cho site local thông qua CA riêng. Bạn có thể truy cập https an toàn. Nếu có cảnh báo chứng chỉ, hãy tin cậy CA của ServBay theo hướng dẫn bảo mật SSL cho website.
- Đảm bảo server phát triển của NestJS (
PORT=8585 npm run start:dev
) đang chạy. Nếu bị ngắt, truy cập sẽ không thành công.
Deploy phiên bản production và truy cập qua ServBay
Trước khi đưa NestJS vào production (dù chỉ trên local), bạn cần build dự án.
Build dự án production
Tại thư mục dự án
/Applications/ServBay/www/servbay-nest-app
, chạy:bashcd /Applications/ServBay/www/servbay-nest-app npm run build
1
2Lệnh này sẽ biên dịch code TypeScript sang JavaScript production trong thư mục
dist
.Chạy server production
Sau khi build, chạy lệnh sau để bật server bản production. Sử dụng
node
để chạy file đã biên dịch và đặtPORT
(vd:8586
), đồng thời bật biến môi trường production:bashcd /Applications/ServBay/www/servbay-nest-app PORT=8586 NODE_ENV=production node dist/main.js
1
2Ở chế độ production, server sẽ tắt tính năng auto reload.
Cấu hình reverse proxy cho production
Quay lại bảng điều khiển ServBay, tab "Websites", thêm hoặc sửa cấu hình site production:
- Tên (Name): Ví dụ
My first NestJS production site
. - Tên miền (Domains): Ví dụ
servbay-nest-test.prod
. - Loại (Type):
Reverse Proxy
. - Địa chỉ IP (IP Address):
127.0.0.1
. - Cổng (Port):
8586
.
Lưu lại cài đặt.
- Tên (Name): Ví dụ
Truy cập website production
Mở browser, vào
https://servbay-nest-test.prod
để kiểm tra phiên bản ứng dụng NestJS chạy production. ServBay vẫn hỗ trợ SSL.
Kết nối cơ sở dữ liệu đi kèm với ServBay
ServBay đi kèm nhiều hệ quản trị cơ sở dữ liệu: MariaDB (tương thích MySQL), PostgreSQL, MongoDB, Redis. Khi dev ứng dụng NestJS, bạn có thể kết nối và dùng ngay các dịch vụ này.
Lưu ý quan trọng: Trước khi kết nối, hãy chắc chắn bạn đã kích hoạt CSDL mình cần trong tab "Packages" của ServBay. Xem thông tin port, user, password mặc định trong ServBay hoặc tài liệu đi kèm. Đối với môi trường production, nên thay đổi credential mặc định và tạo user riêng cho app.
Các ví dụ cấu hình kết nối CSDL phổ biến (sử dụng trong AppModule
hoặc mô-đun riêng):
Kết nối MongoDB
Dùng module
@nestjs/mongoose
để kết nối với MongoDB. Đầu tiên cài các package cần thiết:bashnpm install @nestjs/mongoose mongoose
1Tiếp theo cấu hình trong module:
typescriptimport { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; // ... import khác @Module({ imports: [ MongooseModule.forRoot('mongodb://localhost:27017/servbay-nest-app'), // Port mặc định 27017 // ... module khác ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13Chuỗi kết nối mặc định của ServBay MongoDB là
mongodb://localhost:27017/
. Có thể dùng client như MongoDB Compass hoặcmongosh
để tạo CSDLservbay-nest-app
.Kết nối Redis
Dùng module
@nestjs/redis
. Đầu tiên cài package:bashnpm install @nestjs/redis redis @types/redis
1Sau đó cấu hình như sau:
typescriptimport { Module } from '@nestjs/common'; import { RedisModule } from '@nestjs/redis'; // ... import khác @Module({ imports: [ RedisModule.forRoot({ url: 'redis://localhost:6379', // Port mặc định 6379 }), // ... module khác ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Địa chỉ mặc định Redis của ServBay là
localhost:6379
.Kết nối MariaDB (MySQL compatible)
Dùng module
@nestjs/typeorm
, ServBay hỗ trợ cả MariaDB và MySQL. Bạn có thể chọn loạimysql
hoặcmariadb
. Đầu tiên cài package:bashnpm install @nestjs/typeorm mysql2 typeorm
1Sau đó cấu hình:
typescriptimport { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; // ... import khác @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mariadb', // hoặc 'mysql' host: 'localhost', port: 3306, username: 'root', // user mặc định của ServBay MariaDB/MySQL password: 'password',// password mặc định database: 'servbay_nest_app', // hãy tạo trước database này entities: [], // Array entity của bạn synchronize: true, // Chỉ nên dùng cho dev }), // ... module khác ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22Lưu ý: Mặc định user
root
của ServBay MariaDB/MySQL có password làpassword
. Dùng các client như TablePlus, DBeaver hoặc MySQL CLI để loginlocalhost:3306
bằng tài khoảnroot/password
rồi tạo databaseservbay_nest_app
. Vì lý do bảo mật, khuyến nghị đổi password root và tạo user riêng biệt cho ứng dụng.Kết nối PostgreSQL
Dùng module
@nestjs/typeorm
. Đầu tiên cài package:bashnpm install @nestjs/typeorm pg typeorm
1Cấu hình như sau:
typescriptimport { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; // ... import khác @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, username: 'servbay', // user mặc định ví dụ, hãy kiểm tra thực tế trong control panel ServBay password: 'password',// password mặc định ví dụ database: 'servbay_nest_app', // hãy tạo trước database này entities: [], // Array entity của bạn synchronize: true, // Chỉ nên dùng cho dev }), // ... module khác ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22Lưu ý: Tài khoản mặc định của PostgreSQL trong ServBay có thể là
servbay
hoặcpostgres
, mật khẩu có thể khác. Hãy kiểm tra trong control panel hoặc tài liệu ServBay để lấy thông tin chính xác và tạo databaseservbay_nest_app
cùng user tương ứng nếu cần. Tuyệt đối không dùng default credentials cho production.
Tổng kết
Qua hướng dẫn này, bạn đã nắm được quy trình tạo, chạy và truy cập ứng dụng NestJS local trên macOS với ServBay. Môi trường Node.js tích hợp, hệ quản trị website tiện lợi (đặc biệt hỗ trợ reverse proxy), nhiều CSDL nội bộ mạnh mẽ giúp đơn giản hóa quá trình phát triển thử nghiệm NestJS local. Bạn có thể dễ dàng chuyển đổi giữa chế độ development và production, truy cập ứng dụng qua tên miền tùy chỉnh, bảo mật https và kết nối trực tiếp các dịch vụ cơ sở dữ liệu do ServBay cung cấp.