Validate JSON trước khi debug Nest/Express | Format + phân biệt lỗi cú pháp vs schema

(Cập nhật: 19 tháng 7, 2026 ) JSON formatter validate Unexpected token NestJS Express API debug
Kết luận

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 debugcú 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 Payload hoặ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

Hai lớp lỗi khác nhau
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:

  1. Cú pháp fail → đừng mở Nest debugger. Sửa chuỗi.
  2. Cú pháp OK, schema fail → đọc message field; formatter đã xong nhiệm vụ.
  3. 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.

Format vs Minify vs Validate
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 idUnexpected 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.log kiể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ượngThực chấtViệc cần làm
Unexpected token <Response là HTMLXem status / CDN / auth redirect
Parse OK, field undefinedSchema / mappingDTO, không phải formatter
Console paste chạy đượcObject literal JSKhông chứng minh JSON hợp lệ
File VS Code có //JSONCProduction 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

  1. Lỗi chữ / dấu → cú pháp → format/validate trước.
  2. Lỗi field / type → schema → DTO sau khi parse OK.
  3. 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”.

Liên kết liên quan