Giới Thiệu CLI Resource Generators: NestJS CRUD Trong 1 Phút
Trong bài viết này, chúng ta sẽ tìm hiểu công cụ mới mang tên NestJS CLI Resource Generators và cách chúng có thể đẩy nhanh quá trình phát triển bằng cách tạo tất cả các tệp và mã soạn sẵn cần thiết cho các ứng dụng CRUD.
Cho những bạn chưa biết NestJS là gì, đây là một framework TypeScript Node.js giúp bạn xây dựng các ứng dụng Node.js cấp doanh nghiệp có khả năng mở rộng và tính hiệu quả cao.
Giới thiệu CLI Generators là gì
Trong suốt vòng đời của một dự án, khi chúng ta xây dựng các tính năng mới, tà thường cần thêm các tài nguyên mới vào ứng dụng của mình. Những tài nguyên này thường yêu cầu nhiều thao tác lặp đi lặp lại mỗi khi chúng ta xác định một tài nguyên mới.
Hãy tưởng tượng một kịch bản trong thế giới thực, nơi chúng ta cần hiển thị CRUD endpoints cho 2 thực thể, giả sử ta có thực thể Người dùng và Sản phẩm. Theo best pratice, đối với mỗi thực thể, chúng ta sẽ phải thực hiện một số tác vụ như sau:
Tạo module (nest g mo) để giữ cho code có tổ chức và thiết lập ranh giới rõ ràng (nhóm các thành phần liên quan)
Tạo controller (nest g co) để xác định các tuyến CRUD (hoặc các truy vấn/đột biến cho các ứng dụng GraphQL)
Tạo một dịch vụ (nest g s) để triển khai và cô lập business logic
Tạo một lớp/giao diện thực thể để đại diện cho hình dạng dữ liệu tài nguyên
Tạo Đối tượng truyền dữ liệu - Data Transfer Objects (hoặc input cho các ứng dụng GraphQL) để xác định cách dữ liệu sẽ được truyền qua mạng
Thật nhiều bước!
Giản đồ Resource Generator hỗ trợ tạo bộ điều khiển HTTP, bộ điều khiển Microservice, trình phân giải GraphQL (cả code first và schema first) và Cổng WebSocket.
Tạo CRUD API
Gợi ý Trước khi bạn tiếp tục, hãy đảm bảo cài đặt phiên bản mới nhất của gói @nestjs/cli và @nestjs/schematics.
Để tạo một tài nguyên mới, chỉ cần chạy lệnh sau trong thư mục gốc của dự án của bạn:
$ nest g resource
CLI sẽ thông báo bạn với một số câu hỏi, như được hiển thị trên hình động bên dưới:
Như bạn có thể thấy trong ví dụ trên, lệnh nest g resource không chỉ tạo ra tất cả các khối building block NestJS (mô-đun, dịch vụ, controller class) mà còn tạo cả một entity class, DTO class cũng như các tệp thử nghiệm (.spec). Ngoài ra, nó tự động tạo trình giữ chỗ cho tất cả các CRUD endpoints (các tuyến cho API REST, truy vấn và đột biến cho GraphQL, đăng ký thông báo cho cả Microservices và WebSocket Gateways) - có ngay tất cả mà không cần phải nhấc ngón tay!
LƯU Ý: Các lớp dịch vụ đã tạo không gắn với bất kỳ ORM (hoặc nguồn dữ liệu) cụ thể nào. Điều này làm cho generator trở nên đủ phổ thông để đáp ứng nhu cầu của bất kỳ dự án nào. Theo mặc định, tất cả các phương thức sẽ chứa trình giữ chỗ, cho phép bạn điền vào đó với các nguồn dữ liệu cụ thể cho dự án của bạn.
Tương tự như vậy, nếu bạn muốn tạo các trình phân giải cho ứng dụng GraphQL, chỉ cần chọn GraphQL (code first) (hoặc GraphQL (schema first)) làm lớp truyền tải của bạn. Trong trường hợp này, NestJS sẽ tạo một resolver class thay vì một REST API controller:
$ nest g resource users
> ? What transport layer do you use? GraphQL (code first)
> ? Would you like to generate CRUD entry points? Yes
> CREATE src/users/users.module.ts (224 bytes)
> CREATE src/users/users.resolver.spec.ts (525 bytes)
> CREATE src/users/users.resolver.ts (1109 bytes)
> CREATE src/users/users.service.spec.ts (453 bytes)
> CREATE src/users/users.service.ts (625 bytes)
> CREATE src/users/dto/create-user.input.ts (195 bytes)
> CREATE src/users/dto/update-user.input.ts (281 bytes)
> CREATE src/users/entities/user.entity.ts (187 bytes)
> UPDATE src/app.module.ts (312 bytes)
Gợi ý: Để tránh tạo tệp thử nghiệm, bạn có thể chuyển cờ --no-spec, như sau: nest g resource users --no-spec
Hãy xem đoạn mã được tạo ở trên cho lớp UsersResolver.
Chúng ta có thể thấy bên dưới, không chỉ tất cả các đột biến và truy vấn soạn sẵn được tạo ra, mà tất cả mọi thứ đều gắn liền với nhau. Chúng ta đang sử dụng UsersService, User Entity và thậm chí cả DTO !
import { Resolver, Query, Mutation, Args, Int } from '@nestjs/graphql';
import { UsersService } from './users.service';
import { User } from './entities/user.entity';
import { CreateUserInput } from './dto/create-user.input';
import { UpdateUserInput } from './dto/update-user.input';
@Resolver(() => User)
export class UsersResolver {
constructor(private readonly usersService: UsersService) {}
@Mutation(() => User)
createUser(@Args('createUserInput') createUserInput: CreateUserInput) {
return this.usersService.create(createUserInput);
}
@Query(() => [User], { name: 'users' })
findAll() {
return this.usersService.findAll();
}
@Query(() => User, { name: 'user' })
findOne(@Args('id', { type: () => Int }) id: number) {
return this.usersService.findOne(id);
}
@Mutation(() => User)
updateUser(@Args('updateUserInput') updateUserInput: UpdateUserInput) {
return this.usersService.update(updateUserInput.id, updateUserInput);
}
@Mutation(() => User)
removeUser(@Args('id', { type: () => Int }) id: number) {
return this.usersService.remove(id);
}
}
Lời kết
Hy vọng rằng giản đồ tài nguyên NestJS mới sẽ giúp tăng tốc và cải thiện đáng kể trải nghiệm của nhà phát triển, cho phép chúng ta xây dựng các ứng dụng Nest của mình nhanh hơn nhiều.
Nhận xét
Đăng nhận xét