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 ได้)