環境変数を読むためのより良い方法


このポストは、もともとHuman Who Codes blog on February 16, 2021 .
サーバ側のJavaScriptを書くなら、環境変数から情報を読む必要があります.これは、アクセストークンのような機密情報を共有するための最良の方法と考えられています.しかし、JavaScriptから環境変数が読み込まれる方法は、あなたが理解する時間がかかるかもしれない微妙な方法でエラーがちです.環境変数の読み込み時にエラーが発生した場合は、すぐに知る必要があり、エラーメッセージを解釈する必要はありません.それはenvが来るところです.

インストール
Env [ 1 ]は環境変数を安全に読み、エラーが少なくなるように設計されたゼロ依存ユーティリティです.これはサーバ側のJavaScriptの環境変数に関連するエラーの根本原因に対処することでこれを行う.両方のノードで動作します.jsとdeno、自動的に使用されているランタイムに基づいて、適切な場所から環境変数を読み込みます.
ノードにenvを使用します.NPMでインストールします.
$ npm install @humanwhocodes/env
それから、Env コンストラクタ
import { Env } from "@humanwhocodes/env";

// or

const { Env } = require("@humanwhocodes/env");
envにenvを使うには、Skypackから参照してください.
import { Env } from "https://cdn.skypack.dev/@humanwhocodes/env?dts";
一度あなたがEnv コンストラクタ、次のような新しいインスタンスを作成できます.
const env = new Env();
そして今、環境変数を安全に読む準備が整いました.

問題1 :不足する環境変数
最初の問題envアドレスは、不足している環境変数に対処する方法です.環境変数が誤って設定されていないか、またはいくつかのコンテナ上に存在しているだけであるため、すべての環境変数が不足します.いずれにしても、環境変数をシームレスに処理する必要があります.ノードで.JSは、次のようにします.
const USERNAME = process.env.USERNAME || "guest";
ここでの意図はUSERNAME 環境変数が存在する場合、"guest" . envはデフォルトの設定をクリアします.
const USERNAME = env.get("USERNAME", "guest");
このコードは同じ効果を持ちますが、プロセスの型強制を回避します.もちろん、これは大丈夫ですUSERNAME 行方不明.しかし、もしあなたのアプリケーションが動作するために必要な環境変数が必要な場合はどうですか?そのためには、次のようなコードを書くことができます.
const USERNAME = process.env.USERNAME;
if (!USERNAME) {
    throw new Error("Environment variable USERNAME is missing.");
}
いくつかの簡単な検証のためのコードがたくさんあります.また、いくつかの必要な環境変数を持っている場合は、このパターンを繰り返します.envでは、require() メソッド:
const USERNAME = env.require("USERNAME");
環境変数USERNAME この例では、エラーがスローされます.また、required プロパティも同様です.
const USERNAME = env.required.USERNAME;
この構文を使用すると、文字列を入力するのを避けることができますが、USERNAME が存在しない.

問題1 : 2
環境変数と共通のエラーのもう一つのタイプは、typosです.Typosは、同じことを複数回入力しているときにスポットするのは難しいことができます.たとえば、次のように入力することができます.
const USERNAME = process.env.USERRNAME;
個人的に、私は自分のコードの環境変数の名前を誤って入力することに関連したバグを追跡する時間を費やしました.何らかの理由で、変数の名前を正しく入力しますが、環境変数名を入力しません.JavaScript変数に必要な環境変数と同じ名前を使用する場合は、required プロパティのみを入力します.
const {
    PORT,
    HOST
} = env.required;
ここで2つのローカル変数PORT and HOST , は同じ名前の環境変数から作成される.環境変数のどちらかが見つからない場合、エラーがスローされます.

問題めん3:型ミスマッチ
環境変数を持つ別の微妙な型のエラーは型の不一致です.たとえば、次のノードを考えます.JSコード:
const PORT = process.env.PORT || 8080;
この行、または同様のものが多くのノードに表示されます.JSアプリケーション.ほとんどの場合、問題は発生しません.しかし、そうすることができました.あなたは問題を見つけることはできますか?
すべての環境変数は文字列です.PORT 環境変数が存在する場合は文字列で、そうでない場合は数値です.DENOで同様のコードを使用するとエラーが発生しました.Deno HTTP Serverはポートを必要としていたので、ローカルでうまく動作しましたが、クラウドランに配備したとき、エラーを受けました.
この問題を解決するため、envはすべてのデフォルト値を自動的に文字列に変換します.
const PORT = env.get("PORT", 8080);
console.log(typeof PORT === "string");      // always true
デフォルト値として非文字列値を渡す場合でも、Envは環境変数を読み込むときに文字列値を受け取ることができるように文字列に変換します.

問題No . 4 :フォールバック変数
場合によっては、いくつかの環境変数をチェックして、環境変数が存在しない場合にのみデフォルトを使用することがあります.したがって、次のようなコードを持っているかもしれません.
const PORT = process.env.PORT || process.env.HTTP_PORT || 8080;
envを使って少しクリアにすることができます.
const PORT = env.first(["PORT", "HTTP_PORT"], 8080);
このコードを使用して、envは見つかった最初の環境変数から値を返します.同様get() , first() 環境変数のどれも見つけられないならば、デフォルト値で通過するのを許します、そして、デフォルト値はストリングに自動的に変えられます.追加エラーチェックとして、最初の引数が配列でないか、1つの項目だけの配列であるならば、エラーは投げられます.

結論
Envは私にとってとても価値のあるユーティリティの一つです.私は過去2年間の個人的なプロジェクトの数でそれを使用している、それは私に多くの時間を節約しています.環境変数に関連するデバッグエラーは、誰もが楽しいという考えではありません、そして、私がenvエラーによって救われた時間を数えることができません.私はあなたが同様に役立つことを願っています.
  • Env
  • serve() error: "Uncaught InvalidData"