ตัวแปรสภาพแวดล้อมและการตั้งค่า
ค่าบางอย่างเขียนลงในโค้ดของคุณไม่ได้: คีย์ลับ รหัสผ่านฐานข้อมูล ที่อยู่ของบริการหนึ่งๆ และค่าบางอย่างต้อง เปลี่ยน ไปตามที่ที่แอปทำงานอยู่ โค้ดที่คุณทดสอบบนแล็ปท็อป (สภาพแวดล้อม dev) ควรคุยกับฐานข้อมูลทดสอบ; แอปจริงที่ผู้ใช้ของคุณสัมผัส (สภาพแวดล้อม prod หรือ production) ต้องคุยกับฐานข้อมูลจริง — โดยใช้ โค้ดชุดเดียวกัน
คำตอบคือ ตัวแปรสภาพแวดล้อม (environment variables) (มักเรียกว่า "env vars"): ค่าที่มีชื่อซึ่งอยู่ นอก โค้ดและถูกส่งเข้าไปให้มันตอนที่มันทำงาน โค้ดบอกว่า "ขอ DATABASE_URL หน่อย" และสภาพแวดล้อมเป็นคนตัดสินใจว่าจะส่งค่าไหนให้
# A config file (e.g. .env) — values live here, not in the code
DATABASE_URL=postgres://localhost/myapp_dev
STRIPE_SECRET_KEY=sk_test_51H... # dev = a test key
SEND_REAL_EMAILS=false # don't email real users while testing
มีสองกฎที่จะช่วยคุณพ้นจากความปวดหัวจริงๆ:
- คีย์ลับต้องไม่อยู่ในโค้ดเด็ดขาด สิ่งใดก็ตามที่อยู่ในโค้ดของคุณอาจจบลงด้วยการเปิดเผยต่อสาธารณะ (โดยเฉพาะในรีโพที่แชร์กัน) และคีย์การชำระเงินหรือรหัสผ่านฐานข้อมูลที่รั่วไหลออกไปคือเหตุฉุกเฉินตัวจริง คีย์ลับควรอยู่ในตัวแปรสภาพแวดล้อม ที่ไม่ถูกเก็บไว้ในระบบควบคุมเวอร์ชัน
- Dev และ prod แตกต่างกัน ประเด็นคือโค้ดชุดเดียวกันทำงานถูกต้องในทั้งสองที่ เพราะสภาพแวดล้อม — ไม่ใช่โค้ด — เป็นคนตัดสินใจว่าจะใช้ฐานข้อมูลและคีย์ตัวไหน
โค้ดเดียวกัน สองบ้าน — ตัวแปรสภาพแวดล้อมคือสิ่งที่แตกต่างกัน:
SAME CODE
/ \
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ DEV │ │ PROD │
│ your laptop │ │ hosting (cloud)│
│ test database │ │ real database │
│ test API key │ │ live API key │
│ fake emails │ │ real emails │
└─────────────────┘ └─────────────────┘
only you see it your users see it