Validate JSON trước khi debug Nest/Express | Format + phân biệt lỗi cú pháp vs schema
Trước khi đào Nest/Express: format + validate cú pháp JSON. Unexpected token = chuỗi chưa phải JSON hợp lệ — không phải ValidationPipe. Schema (DTO thiếu field) chỉ chạy sau khi parse thành công. Dán log/API vào JSON Formatter trên trình duyệt, sửa nguồn nếu fail, rồi mới soi controller.
Client báo 500. Bạn mở Nest, đặt breakpoint ở service, đọc stack 40 dòng — rồi phát hiện body copy từ Chrome DevTools bị trailing comma. JSON.parse đã chết từ middleware; ValidationPipe chưa kịp chạy.
Bài này dành freelancer / dev Việt Nam nhận repo Nest hoặc Express, hay dán JSON từ API/log rồi nhảy thẳng vào debug framework. Mục tiêu: tách lỗi cú pháp khỏi lỗi schema, và đưa format/validate vào checklist trước khi mất buổi chiều.
Chi tiết từng token (
],',<) xem thêm JSON Unexpected token. Bài này tập trung workflow trước debug và cú pháp vs schema.
Bài viết này giúp bạn
- Biết khi nào dừng lại để format/validate trước khi mở debugger
- Phân biệt cú pháp JSON vs schema / DTO
- Quy trình an toàn với log có token (xử lý local)
- Case Nest + Express thực tế
- Dùng JSON Formatter Kawa như bước 0
Vì sao freelancer hay nhảy cóc bước validate
Outsourcing / freelance VN thường nhận:
- Log PM2 hoặc CloudWatch: JSON 1 dòng + escape
\" - Screenshot Postman từ khách — bạn gõ lại tay, thêm comment
// - Body từ Network tab copy kèm prefix
Request Payloadhoặc BOM từ Excel/Notion
Instinct: “Nest hỏng” / “Express middleware sai”. Thực tế: parser chưa nhận được object. Format + validate 30 giây tiết kiệm hàng giờ soi DI container.
Cú pháp vs schema — đừng trộn
| Lớp | Triệu chứng | Công cụ / bước |
|---|---|---|
| Cú pháp (syntax) | SyntaxError: Unexpected token, JSON.parse fail, body middleware không gắn req.body | Formatter/validator, jq, sửa serializer / đoạn copy |
| Schema (DTO) | HTTP 400, ValidationPipe, class-validator / Zod: missing property, wrong type | DTO, pipe, contract test — chỉ sau khi parse OK |
| Business | 200 nhưng data sai logic (stock âm, status không hợp lệ) | Unit/integration test, không phải formatter |
Quy tắc vàng:
- Cú pháp fail → đừng mở Nest debugger. Sửa chuỗi.
- Cú pháp OK, schema fail → đọc message field; formatter đã xong nhiệm vụ.
- Cả hai OK → mới đào service / DB.
Format + validate làm gì trong debug
Pretty-print (format)
Thêm indent để thấy nesting, key trùng, array rỗng. Khi log 1 dòng 8KB, mắt người không đọc được — formatter là kính lúp.
Validate (cú pháp)
Xác nhận JSON.parse sẽ thành công. Không thay Zod/DTO. Chỉ trả lời: “đây có phải JSON chuẩn không?”
Minify
Gộp 1 dòng để paste lại curl / compare độ dài. Không dùng minify để “tìm lỗi” — lỗi dễ thấy hơn khi đã pretty-print.
| Thao tác | Khi nào | Không dùng để |
|---|---|---|
| Format | Đọc log, review payload PR, tìm field | Giảm bandwidth production (dùng minify/build) |
| Minify | Reproduce request 1 dòng, ước lượng size | Debug cấu trúc lồng nhau |
| Validate cú pháp | Trước mọi bước Nest/Express debug | Chứng minh business rule đúng |
Workflow khuyến nghị (Nest / Express)
Bước 0 — Raw body sạch
1. Network → Response / Request → Copy (raw)
2. Che Authorization, cookie, PII
3. Dán vào JSON Formatter → Format
Mở JSON Formatter — chạy trên trình duyệt, phù hợp log nội bộ hơn dịch vụ upload lạ.
Bước 1 — Nhánh theo kết quả
Fail cú pháp (ví dụ trailing comma):
{
"email": "[email protected]",
"role": "admin",
}
→ Sửa nguồn (serializer, file config). Express express.json() và Nest mặc định đều dựa parser chặt — không “tha” trailing comma như Console Chrome.
Pass cú pháp nhưng Nest 400:
email must be an email
role must be one of: admin, user
→ Đây là schema. Formatter đã xong; mở DTO:
// Nest — lỗi schema, không phải Unexpected token
export class CreateUserDto {
@IsEmail()
email!: string;
@IsIn(['admin', 'user'])
role!: string;
}
Bước 2 — Chỉ khi body parse được
Đặt breakpoint controller / service. Lúc này req.body là object thật.
Case study 1 — Freelancer Nest + webhook Stripe-like
Khách gửi sample webhook trong Zalo dưới dạng text. Bạn dán vào fixture test:
{
'id': 'evt_1',
"amount": 150000
}
Nháy đơn quanh id → Unexpected token '. Nest không chạy pipe. Bạn sửa thành nháy kép, format lại, test xanh — rồi mới bàn amount VND vs cents (đó là business).
Case study 2 — Express log PM2 cắt giữa chừng
Log:
{"userId":12,"items":[{"sku":"A1","qty":2
Validate fail ngay (thiếu ]}). Nguyên nhân: buffer log truncate, không phải bug route. Format/validate tránh việc bạn “fix” Express CORS cả buổi.
Checklist trước khi debug Nest/Express
- Đã copy raw body (không phải object đã
console.logkiểu JS) - Đã che secret
- Format + validate cú pháp pass
- Status/Content-Type đúng (
application/json, không phải HTML login) - Mới đối chiếu DTO / Zod
- Mới mở debugger framework
Lỗi hay nhầm với “cần format”
| Hiện tượng | Thực chất | Việc cần làm |
|---|---|---|
Unexpected token < | Response là HTML | Xem status / CDN / auth redirect |
Parse OK, field undefined | Schema / mapping | DTO, không phải formatter |
| Console paste chạy được | Object literal JS | Không chứng minh JSON hợp lệ |
File VS Code có // | JSONC | Production parser thường reject |
An toàn khi dán payload
- Ưu tiên tool local-only như JSON Formatter Kawa
- Không dán access token production lên pastebin
- Fixture test: dùng data giả; production log chỉ khi đã redact
Tóm tắt quyết định
- Lỗi chữ / dấu → cú pháp → format/validate trước.
- Lỗi field / type → schema → DTO sau khi parse OK.
- Logic sai → test business — formatter không giúp.
Đưa bước 0 vào checklist PR nội bộ: “mọi fixture JSON phải validate được bằng formatter trước khi merge”.