Giao diện
Xử lý sự cố
Tìm kiếm không trả về kết quả nào
Nguyên nhân thường gặp: chỉ mục chưa được dựng, hoặc hai bản normalize() đã lệch nhau.
bash
npx wrangler d1 execute chuyenchon --remote \
--command "SELECT COUNT(*) FROM search_docs;"Nếu bằng 0 → gọi POST /v1/admin/reindex. Nếu khác 0 mà vẫn không ra kết quả → so lại normalize() trong packages/shared/src/text.ts với bản sao trong apps/api/scripts/build-seed.mjs.
Website hiện khung xám mãi không tải xong
Client không gọi được API. Kiểm tra theo thứ tự:
curl https://api.chuyenchon.com/health— Worker còn sống không.- Console trình duyệt có lỗi CORS không → thêm origin vào
ALLOWED_ORIGINSrồi deploy lại Worker. VITE_API_BASElúc build có đúng không — giá trị này bị nướng vào bundle, đổi biến phải build lại.
Trang chi tiết trả về tiêu đề của trang chủ
Trang đó chưa được prerender. Xem log của scripts/prerender.mjs: nếu có dòng ⚠︎ Không gọi được API thì lúc build API không phản hồi. Deploy API trước rồi build lại web.
vite preview trả về trang chủ cho mọi URL
Đặc thù của công cụ xem thử: nó chỉ phục vụ file tĩnh khi URL kết thúc bằng /. Thử /truong/chuyen-khtn/. Cloudflare Pages xử lý được cả hai dạng.
Migration báo lỗi "table already exists"
Migration cũ đã chạy một phần. Không sửa file migration đã chạy. Với môi trường cục bộ:
bash
pnpm db:reset:localVới môi trường thật: xuất dữ liệu ra, sửa bằng migration mới, không bao giờ sửa file cũ.
db.batch() báo quá nhiều câu lệnh
D1 giới hạn số câu lệnh mỗi lô. rebuildSearchIndex() đã chia lô 200 câu; nếu thêm thực thể mới làm chỉ mục phình to, giữ nguyên cách chia lô đó thay vì nâng kích thước lô.
Điểm chuẩn hiển thị sai năm
Kiểm tra rằng bản ghi mới được thêm dòng chứ không phải sửa đè dòng năm cũ. Ràng buộc duy nhất trên (school_id, year, grade, route_name) sẽ chặn trùng lặp, nhưng không chặn được việc sửa nhầm năm trên một dòng cũ.