Hướng dẫn Khắc phục Sự cố & Câu hỏi Thường gặp (FAQ)
Chào mừng bạn đến với trung tâm khắc phục sự cố! Nếu bạn gặp lỗi, hãy kiểm tra các danh mục bên dưới. Mỗi mục đều tuân theo định dạng Lỗi → Nguyên nhân → Giải pháp để giải quyết nhanh chóng.
Môi trường & Thiết lập
nodejs-quickstart: command not found
- Nguyên nhân: CLI không được cài đặt toàn cục hoặc thiếu đường dẫn PATH.
- Giải pháp: Sử dụng lệnh
npx nodejs-quickstart-structure@latest init(hoặcpnpm dlx/yarn dlx), hoặc cài đặt toàn cục qua trình quản lý gói ưa thích của bạn (ví dụ:npm install -g nodejs-quickstart-structure).
Invalid Node.js version
- Nguyên nhân: Bạn có thể đang chạy phiên bản Node.js dưới 18.x.
- Giải pháp: Nâng cấp môi trường Node.js cục bộ của bạn. Khuyến nghị sử dụng Node.js LTS (v22.x).
EBUSY: resource busy or locked (Windows)
- Nguyên nhân: Tệp bị khóa bởi một tiến trình khác (IDE, terminal hoặc phần mềm diệt virus).
- Giải pháp: Đóng IDE của bạn, khởi động lại terminal dưới quyền Quản trị viên (Administrator) và thử lại lệnh.
Bảo mật & Chất lượng (Snyk/Sonar)
403 Forbidden hoặc Unauthorized (Snyk)
- Nguyên nhân: Thiếu hoặc sai
SNYK_TOKENtrong môi trường của bạn. - Giải pháp:
- Phát triển cục bộ: Nếu việc quét cục bộ thất bại, bạn cần xác thực máy của mình:bash
npx snyk auth # Lệnh này sẽ mở một cửa sổ trình duyệt để bạn đăng nhập. - CI/CD: Đảm bảo Secret trong GitHub/GitLab được đặt tên chính xác là
SNYK_TOKEN. Kiểm tra phần "Repository Secrets" của nhà cung cấp dịch vụ.
- Phát triển cục bộ: Nếu việc quét cục bộ thất bại, bạn cần xác thực máy của mình:
sonar.organization is missing
- Nguyên nhân: SonarCloud yêu cầu khóa tổ chức (organization key) trong tệp
sonar-project.properties. - Giải pháp: Tìm Org Key của bạn trên giao diện SonarCloud UI và cập nhật tệp thuộc tính.
Could not find a default branch (SonarCloud)
- Lỗi:
ERROR Could not find a default branch for project... - Nguyên nhân: Dự án chưa được nhập/tạo trên giao diện SonarCloud UI.
- Giải pháp:
- Đăng nhập vào SonarCloud.
- Nhấp vào "+" -> Analyze new project và nhập kho lưu trữ của bạn.
- Bước quan trọng: Đi tới Administration -> Analysis Method và đảm bảo "Automatic Analysis" đã được TẮT và chọn "GitHub Actions" (hoặc nhà cung cấp của bạn).
- Đảm bảo Project Key (ví dụ:
org_repo-name) trên giao diện SonarCloud khớp với khóa trong tệpsonar-project.propertiescủa bạn.
Husky & Git Hooks
Các Hook không chạy sau khi tạo dự án
- Nguyên nhân: Lệnh
npm install(hoặcpnpm/yarn) được chạy trướcgit init. - Giải pháp: Chạy lệnh
git init, sau đó chạynpx husky install.
Docker & Cơ sở hạ tầng
port is already allocated (ví dụ: 9093)
- Nguyên nhân: Một container hoặc dịch vụ cục bộ khác đang sử dụng cổng này.
- Giải pháp: Dừng tất cả các container bằng lệnh
docker compose downhoặc tìm tiến trình đang sử dụng cổng bằnglsof -i :9093(Mac/Linux) hoặcnetstat -ano | findstr :9093(Windows).
dial unix /var/run/docker.sock: no such file or directory
- Nguyên nhân: Docker socket không được mount hoặc đường dẫn không chính xác cho hệ điều hành của bạn.
- Giải pháp (Windows Git Bash): Sử dụng dấu gạch chéo kép khi mount:
-v //var/run/docker.sock:/var/run/docker.sock.
permission denied (Docker API)
- Nguyên nhân: Người dùng chạy công cụ không có quyền truy cập vào socket.
- Giải pháp: Chạy container CI của bạn dưới quyền
root(ví dụ:--user roottrong docker run) hoặc thêm người dùng vào nhómdocker.
Lỗi tìm kiếm Terraform aws_ami (LocalStack)
- Lỗi:
data.aws_ami.latest: Search returned no resultskhi chạyterraform planhoặcterraform applykhi triển khai cục bộ với LocalStack. - Nguyên nhân: Cấu hình mặc định tìm kiếm AMI Amazon Linux 2 mới nhất bằng bộ lọc
"amzn2-ami-hvm-*". Tuy nhiên, LocalStack chạy trong môi trường cục bộ không bao gồm hoặc hỗ trợ các AMI Amazon Linux 2 tiêu chuẩn theo mặc định, khiến việc tìm kiếm thất bại. - Giải pháp:
- Mở tệp
/terraform/modules/compute/main.tftrong dự án của bạn. - Tìm khối
data "aws_ami" "latest"(khoảng dòng 27). - Thay đổi giá trị bộ lọc từ
"amzn2-ami-hvm-*"thành"*"để khớp với bất kỳ mock AMI nào có sẵn trong LocalStack:hcldata "aws_ami" "latest" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["*"] # Thay đổi từ "amzn2-ami-hvm-*" để tương thích với LocalStack } } - Chạy lại lệnh
terraform apply.
- Mở tệp
CẢNH BÁO
Triển khai AWS Thực tế: Bộ lọc "*" sẽ khớp với bất kỳ hình ảnh nào thuộc sở hữu của Amazon, điều này có thể dẫn đến một hệ điều hành không phải Linux hoặc không tương thích khi triển khai lên AWS thực tế. Trước khi chạy terraform apply trên tài khoản AWS thực, hãy đảm bảo bạn đổi lại giá trị bộ lọc thành "amzn2-ami-hvm-*" để chọn đúng Amazon Linux 2 tiêu chuẩn và script user data (sử dụng yum và docker) thực thi thành công.
Xác minh trạng thái dịch vụ LocalStack
- Vấn đề: Bạn muốn kiểm tra xem các dịch vụ AWS giả lập nào (EC2, RDS, IAM, v.v.) đang chạy thành công bên trong LocalStack hoặc chẩn đoán các sự cố kết nối.
- Giải pháp:
- Mở trình duyệt của bạn hoặc chạy yêu cầu
curltới endpoint kiểm tra sức khỏe của LocalStack:bashcurl http://localhost:4566/_localstack/health - Lệnh này sẽ trả về một phản hồi JSON liệt kê tất cả các dịch vụ được giả lập và trạng thái hoạt động của chúng:json
{ "services": { "ec2": "running", "rds": "running", "elasticache": "running", "iam": "running", "sts": "running", "elbv2": "running", "wafv2": "running" }, "features": { "initScripts": "initialized" } } - Đảm bảo rằng tất cả các dịch vụ bạn đang cố gắng triển khai đều hiển thị trạng thái là
"running"hoặc"available".
- Mở trình duyệt của bạn hoặc chạy yêu cầu
Xác thực & API
Swagger: Lỗi Failed to fetch trên /auth/google hoặc /auth/github
- Vấn đề: Nhấp vào "Execute" trả về lỗi "Failed to fetch" và lỗi CORS.
- Nguyên nhân: Bảo mật trình duyệt (CORS) ngăn cản Swagger UI theo dõi lệnh chuyển hướng (
302) đến một miền bên ngoài (như Google/GitHub) bên trong một yêu cầu AJAX. - Giải pháp:
- Kiểm thử thủ công: Sao chép URL
http://localhost:3000/auth/googledán trực tiếp vào thanh địa chỉ của trình duyệt. Nó sẽ hoạt động hoàn hảo. - Kiểm thử API: Sử dụng điểm cuối
POST /auth/social/exchangetrong Swagger. Đây là một JSON API và không gặp sự cố chuyển hướng.
- Kiểm thử thủ công: Sao chép URL
Swagger: Lỗi 500 Internal Server Error trên /auth/social/exchange
- Vấn đề: Nhận lỗi 500 với thông báo "Failed to authenticate" khi gửi mã code lên Swagger.
- Nguyên nhân: Mã OAuth2 chỉ sử dụng được một lần và đã bị trình duyệt mã hóa URL.
- Giải pháp:
- Lấy mã code MỚI: Truy cập lại URL đăng nhập trong trình duyệt của bạn để lấy mã code mới (chúng sẽ hết hạn sau một lần sử dụng!).
- Giải mã URL (URL Decode): Nếu mã code trên thanh địa chỉ chứa
%2F, bạn phải thay thế nó bằng ký tự/trước khi dán vào Swagger (ví dụ:4%2F0Af...trở thành4/0Af...). - Khớp Redirect URI: Đảm bảo
redirectUritrong JSON body khớp hoàn toàn với URI được đăng ký trong bảng điều khiển Google/GitHub của bạn.
Công việc nền & Hàng đợi Task (BullMQ)
Lỗi Redis Max retries per request
- Lỗi:
MaxRetriesPerRequestError: Reached the max retries per request limit (which is 20) - Nguyên nhân: BullMQ yêu cầu cấu hình
maxRetriesPerRequestphải được đặt thànhnulltrong cấu hình máy khách Redis. Nếu bạn ghi đèredisClienthoặc sử dụng một phiên bản Redis tùy chỉnh, BullMQ sẽ bị lỗi khi nó bị chặn chờ đợi công việc. - Giải pháp: Đảm bảo
redisClientcủa bạn truyền tham sốmaxRetriesPerRequest: nullkhi khởi tạo. Trình tạo Quickstart thực hiện điều này theo mặc định, nhưng hãy kiểm tra lại tệpsrc/config/redisClient.ts(hoặc.js) nếu bạn có chỉnh sửa nó.
Redis OOM (Out of Memory)
- Vấn đề: Máy chủ Redis bị lỗi hoặc đẩy các khóa ra ngoài không mong muốn sau khi xử lý nhiều công việc nền.
- Nguyên nhân: Theo mặc định, BullMQ lưu trữ tất cả các công việc đã hoàn thành và thất bại trong Redis vô thời hạn. Nếu bạn xử lý hàng triệu công việc, bộ nhớ Redis sẽ bị đầy.
- Giải pháp: Thiết lập các tùy chọn
removeOnCompletevàremoveOnFailkhi thêm công việc.typescriptawait emailQueue.add('send-email', data, { removeOnComplete: true, // hoặc một số như 100 để giữ lại 100 công việc gần nhất removeOnFail: 1000 // Giữ lại 1000 công việc thất bại gần nhất để debug });
Lỗi Trình tạo (Generator Issues)
Các template không render chính xác
- Nguyên nhân: Chỉnh sửa trực tiếp các tệp
.ymlthay vì các tệp template.yml.ejs. - Giải pháp: Luôn sửa đổi các tệp bên trong thư mục
templates/có đuôi kết thúc bằng.ejs.
MẸO
Phát hiện sự cố mới? Đừng ngần ngại Mở một Issue trên GitHub!