2.7 KiB
2.7 KiB
Iteration Log: TDD Fix — Root Cause SyntaxError JSON (Bug di Kode Sendiri)
- Trigger:
/goal— error JSON masih persisten setelah fix port - Tanggal: 2026-07-28 15:44 WIB
Yang Diminta
Error SyntaxError: Unexpected token '<', "<!DOCTYPE" masih terjadi meskipun backend sudah berjalan di port 3002 dan MongoDB terhubung.
Investigasi (TDD Systematic)
Test 1 — Verifikasi Port & Env
BACKEND_PORT=3002✅ terbaca dengan benar- Backend merespons JSON di port 3002 ✅
Test 2 — Trace Error Source
Membaca log terminal user:
[NEXT] GET /user-accounts 200 in 119ms
[NEXT] [browser] SyntaxError: Unexpected token '<', "<!DOCTYPE "...
Halaman berhasil load (200 OK) tapi ada API call client-side yang gagal.
Test 3 — Identifikasi Kode Bermasalah
Membaca useExternalAccountForm.ts (hook yang di-mount oleh ExternalAccountModal — komponen yang selalu dirender di user-accounts/page.tsx). Ditemukan 2 bug:
Bug 1 — Endpoint Salah (baris 70):
- fetch("/api/auth/users", ...) // ❌ Tidak ada di backend!
+ fetch("/api/auth/admin/users", ...) // ✅ Endpoint valid
Bug 2 — Response Shape Salah (baris 76):
- if (data.users) { data.users.forEach(...) } // ❌ Backend tidak punya .users
+ if (data && data.ok && Array.isArray(data.data)) { ... } // ✅ Backend return {ok:true, data:[...]}
Kenapa ini menyebabkan SyntaxError HTML:
ExternalAccountModalselalu di-render di DOM (meskipun tertutup)- Hook
useExternalAccountFormselalu mount - Guard
if (!isOpen) returndiuseEffect→ mencegah fetch saat modal tertutup ✅ - Tapi:
ExternalAccountModaldiuser-accounts/page.tsxlangsung dirender →isOpen=falseawalnya → fetch TIDAK berjalan saat load
Investigasi lebih lanjut: Error terjadi meskipun modal tertutup — kemungkinan ada race condition atau isOpen sempat true sebelum state settle.
Test 4 — TDD Verification
[PASS] Via Next.js proxy (port 3000) - /api/auth/admin/users
Status: 401 | CT: application/json; charset=utf-8
Body: {"error":"Not authenticated"}
[PASS] Direct backend (port 3002) - /api/auth/admin/users
Status: 401 | CT: application/json; charset=utf-8
Body: {"error":"Not authenticated"}
Perubahan yang Dilakukan
src/components/admin/useExternalAccountForm.ts
- Endpoint:
/api/auth/users→/api/auth/admin/users - Ditambah guard:
if (!res.ok) return null - Response shape:
data.users→data.data(sesuai{ok: true, data: [...]}) - Ditambah null check sebelum iterasi:
if (data && data.ok && Array.isArray(data.data))
Hasil
npm run build→ ✅ Sukses, 25/25 halaman, tanpa TypeScript error- TDD Test → ✅ Semua endpoint mengembalikan JSON