Kodokon kodokon.com

設定と秘密情報

dotenvで設定をコードの外へ出し、開発と本番を分け、秘密情報をGitの外に保ちましょう。

8 分 · 3 問

このレッスンを Kodokon で開く

待ち受けるポート、データベースのURL、APIキー。これらはどれもソースコードに置くべきものではありません。これらの値はあなたのマシンと本番とで変わり、いくつかは秘密情報です。標準的な解決策は、環境変数です。開発中は.envファイルから読み込みます。npm install dotenvdotenvをインストールし、プロジェクトのルートにこのファイルを作成しましょう。

BASH
PORT=3000
DATABASE_URL=postgres://localhost:5432/kodokon
SESSION_SECRET=change-this-value
.env - 1行につき1変数

エントリーポイントの一番最初で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_ENVproductionになります。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. データベースのパスワードはどこに置きますか?
    • ソースコード内の定数に
    • Gitに無視される.envファイルに
    • プロジェクトのREADMEに
    • 設定ファイルのコメントに
  2. .env.exampleファイルの目的は何ですか?
    • 本物のバックアップ値を保持するため
    • 機密の値なしに、期待される変数を文書化するため
    • テスト環境を設定するため
  3. 秘密情報を誤ってコミットしてしまいました。まず何をしますか?
    • コミットを削除して先に進む
    • 秘密情報を失効させて新しいものを生成する
    • ファイルを.gitignoreに追加する