NestJS PoC Todo - Learning Notes
สรุปการเรียน NestJS ผ่านโปรเจกต์จริง PoC Todo REST API (โฟลเดอร์ ~/Desktop/project/poc_nestjs_todo) — ผู้เรียนมีพื้น Java/Spring + Hibernate มาก่อน จึงเรียนแบบเทียบ concept ตลอด เรียนจบ Phase 1 (core + CRUD + validation + testing) และ Phase 2 (auth)
สิ่งที่สร้าง
Todo REST API ที่มีระบบ login — แต่ละคนเห็นเฉพาะ todo ของตัวเอง
Client (curl/Postman/Swagger) → HTTP + JWT → NestJS app
├── AuthModule register / login (ออก JWT)
├── TodosModule CRUD todo (Guard + ผูกกับ user)
├── PrismaModule เชื่อม DB (global)
└── ConfigModule โหลด .env (global)
→ SQLite (dev.db): ตาราง User, Todo (1—* relation)
Stack: NestJS 11 + Prisma 7 + SQLite + class-validator + JWT(bcrypt) + Swagger + Jest
สิ่งที่ได้เรียนรู้ (mapped เข้าหน้า wiki)
- แกนหลัก Module/Controller/Service/DI, Request Lifecycle 4 ด่าน, Decorator, Validation, JWT Auth → NestJS
- Prisma 7 (schema, migration, driver adapter, ownership scoping) → Prisma
- ทุกอย่างเทียบ Spring / Spring Boot / Dependency Injection
ปัญหาจริงที่เจอ + วิธีแก้ (ของมีค่าที่สุด)
| ปัญหา | วิธีแก้ |
|---|---|
nest new --skip-git ไม่สร้าง .gitignore → เผลอ commit node_modules 29k ไฟล์ | reset --soft + git gc, เขียน .gitignore เอง |
Prisma 7 ESM ชน CommonJS (exports is not defined) | moduleFormat = "cjs" ใน schema |
Prisma 7 ไม่อ่าน .env เอง / ต้องใช้ adapter | @nestjs/config + @prisma/adapter-better-sqlite3 |
build ออกเป็น dist/src/main.js | ย้าย generated เข้า src/ + exclude prisma.config.ts |
EADDRINUSE (port ชน) | lsof -ti:3000 | xargs kill -9 |
jest หา .js import ไม่เจอ | moduleNameMapper ตัด .js |
| เพิ่ม required column บนตารางที่มีข้อมูล | เคลียร์ data ก่อน migrate |
วิธีรัน
npm run start:dev # รันแอป (auto-reload)
npm run test:api # smoke test API (ต้องรัน server ก่อน)
npm test # unit test
# เอกสาร: http://localhost:3000/api (Swagger — กด Authorize ใส่ token ได้)