JuniorNode.js

Bạn quản lý cấu hình và bí mật của một ứng dụng Node.js thế nào để dự án chạy giống nhau trên mọi máy?

Người phỏng vấn muốn biết bạn phân biệt được code với cấu hình, biết giữ bí mật ngoài Git, và đã từng gặp những lỗi kiểu "máy em chạy mà".

Nguyên tắc cơ bản: mọi thứ thay đổi giữa các môi trường (cổng, đường dẫn, khóa API, chuỗi kết nối) nằm ngoài code, và code đọc chúng từ biến môi trường qua process.env. Hai điều cần nhớ là giá trị trong process.env luôn là chuỗi, và biến có thể không tồn tại. Từ đó sinh ra các lỗi quen thuộc: Number("abc") ra NaN, biến đặt rỗng được Number("") đổi thành 0, và Boolean("false") lại là true.

Cách làm tốt là gom việc đọc cấu hình vào một chỗ, kiểm tra từng biến bằng một thư viện schema như Zod, đổi sang đúng kiểu, và nếu sai thì dừng ngay lúc khởi động với thông báo nói rõ biến nào sai. Bí mật thì không có giá trị mặc định, vì mặc định kiểu "changeme" chẳng khác gì để cửa mở.

Về file: dùng .env cho máy phát triển và nạp bằng node --env-file=.env (hoặc thư viện dotenv với Node cũ), thêm .env vào .gitignore, và commit một file .env.example liệt kê mọi biến để người mới biết cần điền gì. Trên máy chủ thật, đặt biến trong hệ thống deploy hoặc kho bí mật của CI, không dùng file.

Điểm cộng: nhắc rằng giá trị đặt trong terminal thắng giá trị trong file .env, nên một biến bạn đã export từ hôm trước có thể âm thầm lờ đi file, và nói được nếu lỡ commit một khóa thật thì việc đầu tiên là thu hồi nó.