Kodokon kodokon.com

การกำหนดค่าและข้อมูลลับ

ดึงการกำหนดค่าออกจากโค้ดด้วย dotenv แยกสภาพแวดล้อมการพัฒนาออกจากโปรดักชัน และเก็บข้อมูลลับของคุณให้พ้นจาก Git

8 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

พอร์ตที่ใช้ฟัง URL ของฐานข้อมูล คีย์ API สิ่งเหล่านี้ล้วนไม่ควรอยู่ในซอร์สโค้ด ค่าเหล่านี้เปลี่ยนไประหว่างเครื่องของคุณกับโปรดักชัน และบางค่าคือ ข้อมูลลับ (secrets) วิธีมาตรฐานคือ ตัวแปรสภาพแวดล้อม (environment variables) ที่โหลดจากไฟล์ .env ในระหว่างการพัฒนา ติดตั้ง dotenv ด้วย npm install dotenv แล้วสร้างไฟล์ไว้ที่รากของโปรเจกต์

BASH
PORT=3000
DATABASE_URL=postgres://localhost:5432/kodokon
SESSION_SECRET=change-this-value
.env - หนึ่งตัวแปรต่อหนึ่งบรรทัด

อิมพอร์ต dotenv/config ที่จุดเริ่มต้นสุดของไฟล์เข้าโปรแกรมของคุณ ตัวแปรในไฟล์จะถูกคัดลอกเข้าไปใน process.env นิสัยที่ดีของมืออาชีพคือ รวมการอ่านค่าไว้ในมอดูลการกำหนดค่าเพียงตัวเดียว ตรวจสอบตัวแปรตอนเริ่มทำงาน และล้มเหลวทันทีหากขาดค่าใดไป เซิร์ฟเวอร์ที่ปฏิเสธจะเริ่มทำงาน ดีกว่าเซิร์ฟเวอร์ที่ล่มตอนคำขอแรก

JAVASCRIPT
import "dotenv/config";

const required = ["PORT", "SESSION_SECRET"];

for (const name of required) {
  if (!process.env[name]) {
    throw new Error("Missing variable: " + name);
  }
}

export const config = {
  port: Number(process.env.PORT),
  secret: process.env.SESSION_SECRET,
  isProd: process.env.NODE_ENV === "production"
};
config.js - มอดูลเดียวที่อ่าน process.env

ในโปรดักชันไม่มีไฟล์ .env โฮสต์จะเป็นผู้ให้ค่าจริง และ NODE_ENV จะเป็น production ใช้ config.isProd เพื่อปรับพฤติกรรม เช่น ล็อกแบบละเอียดในระหว่างการพัฒนา และข้อความแจ้งข้อผิดพลาดแบบสงวนท่าทีในโปรดักชัน อีกทั้งควรคอมมิตไฟล์ .env.example ที่แสดงรายการตัวแปรที่คาดหวังพร้อมค่าตัวอย่าง มันช่วยอธิบายการกำหนดค่าโดยไม่เปิดเผยข้อมูลลับ

JAVASCRIPT
import express from "express";
import { config } from "./config.js";

const app = express();

if (!config.isProd) {
  console.log("Development mode");
}

app.listen(config.port, () => {
  console.log("Port: " + config.port);
});
server.js - โค้ดส่วนที่เหลือไม่ยุ่งกับ process.env

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. คุณจะเก็บรหัสผ่านของฐานข้อมูลไว้ที่ไหน?
    • ในค่าคงที่ในซอร์สโค้ด
    • ในไฟล์ .env ที่ Git เพิกเฉย
    • ใน README ของโปรเจกต์
    • ในคอมเมนต์ในไฟล์การกำหนดค่า
  2. ไฟล์ .env.example มีไว้เพื่ออะไร?
    • เพื่อเก็บค่าจริงสำรองไว้
    • เพื่ออธิบายตัวแปรที่คาดหวัง โดยไม่มีค่าที่อ่อนไหว
    • เพื่อกำหนดค่าสภาพแวดล้อมสำหรับทดสอบ
  3. ข้อมูลลับถูกคอมมิตไปโดยผิดพลาด คุณจะทำอะไรเป็นอย่างแรก?
    • ลบคอมมิตทิ้งแล้วเดินหน้าต่อ
    • เพิกถอนข้อมูลลับแล้วสร้างขึ้นใหม่
    • เพิ่มไฟล์ลงใน .gitignore