date
Dec 14, 2025
slug
docs-traning-be-intern-week-3
status
Published
tags
NestJs
Backend
summary
Tổng hợp docs trainning back-end Intern Week 3
type
Post
TUẦN 3 – JAVASCRIPT & NESTJS
Mục tiêu:
- Hiểu JS chạy thế nào trong backend
- Không mơ hồ về async/await
- Hiểu NestJS khác Express ở đâu
- Tự build được API NestJS có structure chuẩn
- Trả lời được câu hỏi JS/NestJS khi phỏng vấn
A. JAVASCRIPT NỀN TẢNG (BACKEND)
1. JavaScript trong backend khác frontend ở đâu?
Trả lời:
- Backend JS chạy trên Node.js
- Không có DOM, window
- Tập trung vào:
- I/O
- Network
- File system
- Concurrency
👉 Backend JS = xử lý bất đồng bộ, không phải UI.
2. Event Loop là gì? (CÂU HỎI CỰC KỲ QUAN TRỌNG)
Trả lời ngắn gọn chuẩn:
Event loop là cơ chế cho phép JS:
- Chạy non-blocking
- Xử lý async task trên single thread
Thứ tự cơ bản
- Call stack
- Microtask queue (Promise)
- Macrotask queue (setTimeout, IO)
👉 Promise luôn chạy trước setTimeout.
3. Vì sao Node.js single thread nhưng xử lý nhiều request?
Trả lời:
- JS chạy single thread
- I/O chạy async (libuv, thread pool)
- Không block CPU
👉 Node.js mạnh ở I/O bound, yếu ở CPU bound.
4. Blocking vs Non-blocking
- Blocking: chặn event loop → toàn server đứng
- Non-blocking: trả control về event loop
❌ Sai:
while(true) {}
👉 Backend JS phải tránh CPU nặng.
5. Callback hell là gì? Giải quyết thế nào?
- Callback hell: callback lồng callback
- Giải pháp:
- Promise
- async/await
👉 async/await chỉ là syntax sugar cho Promise.
B. ASYNC / AWAIT & PROMISE
6. Promise là gì?
Promise đại diện cho kết quả trong tương lai:
- pending
- fulfilled
- rejected
👉 Promise chỉ resolve/reject 1 lần.
7. async/await hoạt động thế nào?
Trả lời:
- async function luôn trả Promise
- await:
- pause function
- không block event loop
👉 await ≠ block thread.
8. Xử lý lỗi async đúng cách?
❌ Sai:
await doSomething()
✅ Đúng:
try {
await doSomething()
} catch (e) {
handleError(e)
}
👉 Không catch = unhandled rejection.
9. Promise.all vs Promise.allSettled
- Promise.all:
- fail 1 → fail tất cả
- Promise.allSettled:
- chờ hết
👉 Dùng đúng ngữ cảnh.
C. TYPESCRIPT (BẮT BUỘC VỚI NESTJS)
10. Vì sao backend nên dùng TypeScript?
Trả lời:
- Catch bug sớm
- Refactor an toàn
- Code dễ maintain
- Team scale tốt
👉 TypeScript = đầu tư dài hạn.
11. Interface vs Type
- Interface:
- Extend tốt
- Dùng cho object
- Type:
- Union, intersection
👉 Trong NestJS: interface rất phổ biến.
12. Optional vs Nullable khác gì?
- Optional: có thể không tồn tại
- Nullable: tồn tại nhưng giá trị null
👉 Nhầm chỗ này = bug logic.
D. NODE.JS RUNTIME
13. Node.js là gì?
Node.js = JS runtime:
- V8 engine
- libuv
- event loop
👉 Node ≠ JS language.
14. process.env là gì?
- Lưu environment variable
- Config theo môi trường
👉 Không hard-code secret.
15. Vì sao không dùng console.log trong production?
- Chậm
- Không cấu trúc
- Khó trace
👉 Dùng logger (winston, pino).
E. NESTJS CORE (RẤT QUAN TRỌNG)
16. NestJS là gì?
NestJS là backend framework:
- Dựa trên Express/Fastify
- Opinionated
- Dùng DI (Dependency Injection)
👉 NestJS giống Spring Boot của Java.
17. NestJS khác Express ở đâu?
Express | NestJS |
Tự do | Opinionated |
Khó scale | Dễ scale |
Ít structure | Structure rõ |
👉 Project lớn → NestJS.
18. Controller là gì?
- Nhận request
- Trả response
- Không chứa business logic
👉 Controller mỏng.
19. Service là gì?
- Chứa business logic
- Reusable
- Testable
👉 Logic không để trong controller.
20. Module là gì?
- Gom controller + service
- Quản lý scope
👉 Module = boundary.
21. Dependency Injection là gì?
DI = không new object trực tiếp:
- Dễ test
- Loose coupling
👉 DI là lý do NestJS mạnh.
22. Provider lifecycle
- Singleton (default)
- Request-scoped
- Transient
👉 Dùng sai scope = bug performance.
F. PIPE, GUARD, INTERCEPTOR
23. Pipe dùng để làm gì?
- Validate
- Transform data
👉 Validation ở pipe, không ở controller.
24. Guard dùng để làm gì?
- Authorization
- Auth check
👉 Guard chạy trước controller.
25. Interceptor dùng để làm gì?
- Logging
- Transform response
- Performance metric
👉 Interceptor = middleware nâng cao.
G. ERROR HANDLING TRONG NESTJS
26. Exception filter là gì?
- Bắt lỗi toàn cục
- Chuẩn hóa response
👉 Không throw raw error.
27. Vì sao NestJS throw HttpException?
- Gắn status code
- Control response
👉 Backend chuyên nghiệp không throw Error bừa bãi.
H. PHỎNG VẤN & CÂU HỎI BẪY
28. NestJS có chậm hơn Express không?
Trả lời chuẩn:
- Overhead nhỏ
- Đổi lại maintainability
👉 Production chọn maintain.
29. Có cần TypeScript không?
❌ “Không cần”
✅ “Cần khi project lớn”
30. Khi nào không nên dùng Node.js?
- CPU heavy
- ML training
- Video encoding
👉 Node không phải silver bullet.
I. BÀI TẬP TUẦN 3 (BẮT BUỘC)
- Tạo NestJS project
- 1 module users
- CRUD API
- DTO + validation
- Global exception filter
CHECKLIST TUẦN 3
- Hiểu event loop
- Không sợ async/await
- Biết structure NestJS
- Controller mỏng
- Logic ở service
- Dùng DTO + pipe