NestJS ตั้งแต่ศูนย์: ระบบจัดการหนังสือ
ตั้งแต่ติดตั้งเครื่องมือ สร้างโฟลเดอร์ รัน npm จนยิง API ได้ พร้อมลิงก์เรียนรู้ CRUD และ Swagger แยกภาษาไทยและภาษาอังกฤษ
วิธีเริ่มต้น
1ติดตั้ง Node.js
ดาวน์โหลดเวอร์ชัน LTS จาก nodejs.org (npm จะติดมาด้วย) แล้วเช็คใน terminal
node -v npm -v
2ติดตั้ง Nest CLI
เครื่องมือบรรทัดคำสั่งของ NestJS ติดตั้งครั้งเดียวใช้ได้ทุกโปรเจกต์
npm i -g @nestjs/cli nest --version
ถ้าขึ้น nest is not recognized ให้ปิดแล้วเปิด terminal ใหม่ ส่วน Windows PowerShell ที่ติด execution policy ให้ใช้ Command Prompt แทน
3สร้างโฟลเดอร์และโปรเจกต์
เลือกที่เก็บงาน แล้วให้ Nest สร้างโฟลเดอร์โปรเจกต์ให้เอง (ไม่ต้อง mkdir ชื่อโปรเจกต์) เลือก npm เมื่อถูกถาม
mkdir projects && cd projects nest new library-api cd library-api
4รันครั้งแรก
npm run start:dev
เปิด http://localhost:3000 จะเห็น Hello World! โหมดนี้รีสตาร์ทเองทุกครั้งที่เซฟไฟล์ (หยุดด้วย Ctrl+C)
5ติดตั้งแพ็กเกจเพิ่ม
npm install class-validator class-transformer @nestjs/swagger
สองตัวแรกใช้ตรวจความถูกต้องของข้อมูล (ตอบ 400) ตัวที่สามสร้างหน้าเอกสาร API ที่ /docs
6สร้างโครง CRUD
nest g resource books
เลือก REST API และตอบ Yes ตอนถามเรื่อง CRUD entry points จะได้ module, controller, service, DTO และ entity ครบ จากนั้นนำโค้ดของ books.controller.ts, books.service.ts, book.dto.ts ที่ผมให้ไว้ก่อนหน้านี้มาวางทับ
ตัวสร้างอัตโนมัติใช้ PATCH สำหรับแก้ไข แต่โจทย์ของเราใช้ PUT จึงต้องแก้ใน controller ตามโค้ดที่ให้ไว้
| ไฟล์ | หน้าที่ |
|---|---|
| books.controller.ts | กำหนด route GET/POST/PUT/DELETE |
| books.service.ts | ตรรกะและข้อมูลจำลอง |
| dto/book.dto.ts | รูปแบบข้อมูลและ validation |
7เปิด Validation และ Swagger ใน main.ts
import { NestFactory } from '@nestjs/core';
import { ValidationPipe } from '@nestjs/common';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
const cfg = new DocumentBuilder().setTitle('Library API').build();
SwaggerModule.setup('docs', app, SwaggerModule.createDocument(app, cfg));
await app.listen(3000);
}
bootstrap();8ทดสอบ
เปิด http://localhost:3000/docs แล้วกด Try it out หรือใช้ curl
curl http://localhost:3000/books curl -i http://localhost:3000/books/999 # ได้ 404
| คำสั่ง | ใช้ทำอะไร |
|---|---|
| npm run start:dev | รันตอนพัฒนา (auto reload) |
| npm run build | คอมไพล์เป็นโฟลเดอร์ dist |
| npm run start:prod | รันจากโค้ดที่ build แล้ว |
| npm run test | รันเทสต์ |
ปัญหาที่พบบ่อย
Cannot find module './dto/book.dto' แปลว่าไฟล์ไม่ได้อยู่ที่ src/books/dto/book.dto.ts หรือชื่อสะกดไม่ตรง
EADDRINUSE แปลว่าพอร์ต 3000 ถูกใช้อยู่ ให้ปิดโปรเจกต์เดิมหรือเปลี่ยนพอร์ตใน listen()
การใช้ Swagger
Swagger ทำอะไรได้
สร้างหน้าเอกสาร API ให้อัตโนมัติจากโค้ด เปิดที่ /docs เห็นทุก endpoint และกด Try it out เพื่อยิง API ทดสอบได้เลย (ตั้งค่าใน main.ts ตามขั้นที่ 7 ด้านบน)
DTO ใส่ @ApiProperty({ example: ... }) เพื่อให้ช่อง Request body มีตัวอย่างข้อมูล
Controller ใส่ decorator เหล่านี้เพื่อบอกสถานะที่ตอบกลับ
import { ApiTags, ApiOperation, ApiOkResponse,
ApiCreatedResponse, ApiNotFoundResponse } from '@nestjs/swagger';
@ApiTags('books') // จัดกลุ่มหัวข้อ
@Controller('books')
export class BooksController {
@Get(':id')
@ApiOperation({ summary: 'ดึงหนังสือเล่มเดียว' })
@ApiOkResponse({ description: 'พบหนังสือ (200)' })
@ApiNotFoundResponse({ description: 'ไม่พบหนังสือ (404)' })
findOne(@Param('id', ParseIntPipe) id: number) { ... }
@Post()
@ApiCreatedResponse({ description: 'สร้างสำเร็จ (201)' })
create(@Body() dto: BookDto) { ... }
}ถ้าอยากไม่ต้องเขียน @ApiProperty ทุกฟิลด์ ให้เปิด CLI plugin โดยเพิ่ม @nestjs/swagger ใน nest-cli.json (ดูลิงก์หัวข้อ “เรื่อง Swagger” ท้ายหน้า)
📘 ฟังก์ชันจัดการตัวแปรแต่ละชนิดใน TypeScript
กดหัวข้อเพื่อเปิดดูตาราง ฟังก์ชัน ตัวอย่าง และผลลัพธ์ แต่ละแถวเป็นอิสระต่อกัน (ไม่ต่อเนื่องจากแถวก่อนหน้า) บางฟังก์ชัน เช่น replaceAll, at, Promise.any ต้องตั้ง target หรือ lib ใน tsconfig เป็น ES2022 ขึ้นไป (โปรเจกต์ NestJS รุ่นใหม่ตั้งไว้ให้แล้ว)
🇹🇭 เว็บภาษาไทยเรื่อง NestJS CRUD
พบ 9 ลิงก์ (บทความไทยมีน้อย) หลายชิ้นเก่า 2–5 ปี คำสั่งบางอย่างอาจเปลี่ยนไปแล้ว ให้เทียบกับ docs.nestjs.com