Lỗi hay gặp khi code backend Node.js, NestJS và PostgreSQL Trung cấp
Vấn đề
Phần tiêu đề “Vấn đề”Phần lớn bug production không đến từ thuật toán khó. Chúng đến từ vài chục lỗi lặp đi lặp lại: quên await, tiền bằng float, transaction chạy sai connection, fetch không timeout.
Cụm này gom các lỗi đó thành một danh mục. Mỗi lỗi là một cặp BAD/GOOD kèm “Vì sao”: hỏng cái gì, khi nào nổ, tại sao. Mọi hành vi đều đã chạy thử trên Node 24 và PostgreSQL 17.
Bug nằm ở đâu trong một request
Phần tiêu đề “Bug nằm ở đâu trong một request”Đang tải diagram…
- Input sai kiểu đi thẳng xuống DB hoặc làm treo regex.
- Async sai làm lỗi không về đúng
try/catch, hoặc làm sập process. - Tài nguyên là chặng cuối nhưng ảnh hưởng ngược lại mọi request khác.
Trong cụm này
Phần tiêu đề “Trong cụm này”| Trang | Câu hỏi nó trả lời | Ví dụ lỗi |
|---|---|---|
| Async & lỗi | Vì sao lỗi không bắt được, process tự thoát? | async trong forEach; return thiếu await trong try; fire-and-forget không .catch |
| Số, ngày, chuỗi | Vì sao tiền lệch, ngày lệch, id đổi giá trị? | count(*) trả "1"; new Date('2026-10-18') là UTC; cột timestamp không timezone |
| Database & transaction | Vì sao query chậm, dữ liệu trùng hoặc mất cập nhật? | N+1; check-then-insert; BEGIN bằng pool.query |
| API & bảo mật | Vì sao API lộ dữ liệu hoặc bị lợi dụng? | nối chuỗi vào SQL raw; lấy object theo id không kiểm tra chủ sở hữu; jwt.decode thay vì verify |
| Hiệu năng & tài nguyên | Vì sao chạy tốt khi test mà chậm/OOM trên production? | pbkdf2Sync trong handler; Promise.all 10k phần tử; fetch không timeout |
Đọc theo thứ tự trong bảng nếu mới vào nghề. Đã có kinh nghiệm thì nhảy thẳng tới checklist cuối mỗi trang.
Dùng danh mục khi code review
Phần tiêu đề “Dùng danh mục khi code review”Đang tải diagram…
- Comment bằng link: “Chỗ này là return thiếu await”. Người nhận đọc được ví dụ đầy đủ và hậu quả, reviewer không phải giải thích lại.
- Gắn mức độ: lỗi làm sai dữ liệu hoặc sập process (fire-and-forget, float tiền, check-then-insert) là blocker; lỗi hiệu năng ở đường ít gọi có thể là nit.
- Biến thành lint/test khi lặp lại nhiều: ví dụ
@typescript-eslint/no-floating-promisesbắt Promise không được xử lý. - Lỗi mới gặp ở postmortem thì thêm thành cặp BAD/GOOD ở trang phù hợp.
Quy trình review đầy đủ xem Code review.
Bài liên quan
Phần tiêu đề “Bài liên quan”| Chủ đề | Bài |
|---|---|
| Event loop, vì sao code đồng bộ chặn mọi request | Event loop Node.js |
| Transaction đúng cách với ORM | Transaction patterns |
| Input validation, secret, injection | Secure coding |
| Timeout và retry khi gọi ra ngoài | Timeout budget |
Tiếp theo: Async & lỗi.