tsconfig.json ファイルを使って Node.js + TypeScript で環境変数を使う

2024-04-02

Node.js + TypeScript で process.env を使う方法

型定義ファイルの作成

env.d.ts という名前のファイルを作成し、以下のコードを追加します。

declare global {
  namespace NodeJS {
    interface ProcessEnv {
      // 環境変数の型定義
      PORT: number;
      DB_HOST: string;
      API_KEY: string;
    }
  }
}

この例では、PORTDB_HOSTAPI_KEY という環境変数を定義しています。それぞれの変数の型は、numberstringstring としています。

環境変数の読み込み

環境変数は .env ファイルなどから読み込む必要があります。.env ファイルは、プロジェクトのルートディレクトリに配置する必要があります。

.env ファイルの例:

PORT=3000
DB_HOST=localhost
API_KEY=secret-key

環境変数をコードで読み込むには、process.env オブジェクトを使用します。

const port = process.env.PORT;
const dbHost = process.env.DB_HOST;
const apiKey = process.env.API_KEY;

console.log(`port: ${port}`);
console.log(`dbHost: ${dbHost}`);
console.log(`apiKey: ${apiKey}`);

上記のコードでは、process.env オブジェクトから PORTDB_HOSTAPI_KEY という環境変数を取得し、それぞれ portdbHostapiKey という変数に代入しています。

型チェック

型定義ファイルを作成することで、コード内で環境変数の型をチェックできます。

if (typeof port !== 'number') {
  throw new Error('PORT is not a number');
}

if (typeof dbHost !== 'string') {
  throw new Error('DB_HOST is not a string');
}

if (typeof apiKey !== 'string') {
  throw new Error('API_KEY is not a string');
}

上記のコードでは、portdbHostapiKey という変数の型が定義されていることを確認しています。型が一致しない場合は、エラーが発生します。

その他のライブラリ

dotenv などのライブラリを使用することで、.env ファイルの読み込みや環境変数の型定義をより簡単にできます。

補足

  • 上記は Node.js + TypeScript で process.env を使う方法の基本的な例です。
  • 環境変数の読み込みや型定義には、様々な方法があります。



env.d.ts

declare global {
  namespace NodeJS {
    interface ProcessEnv {
      PORT: number;
      DB_HOST: string;
      API_KEY: string;
    }
  }
}

index.ts

import * as dotenv from 'dotenv';

dotenv.config();

const port = process.env.PORT;
const dbHost = process.env.DB_HOST;
const apiKey = process.env.API_KEY;

console.log(`port: ${port}`);
console.log(`dbHost: ${dbHost}`);
console.log(`apiKey: ${apiKey}`);

if (typeof port !== 'number') {
  throw new Error('PORT is not a number');
}

if (typeof dbHost !== 'string') {
  throw new Error('DB_HOST is not a string');
}

if (typeof apiKey !== 'string') {
  throw new Error('API_KEY is not a string');
}

.env

PORT=3000
DB_HOST=localhost
API_KEY=secret-key

実行方法

$ npm install dotenv

$ node index.ts

出力結果

port: 3000
dbHost: localhost
apiKey: secret-key
  • このコードは、dotenv ライブラリを使って .env ファイルを読み込んでいます。
  • .env ファイルは、プロジェクトのルートディレクトリに配置する必要があります。
  • 環境変数は .env ファイルに記述する必要があります。
  • コードを実行する前に、dotenv ライブラリをインストールする必要があります。



process.env を使う他の方法

dotenv ライブラリ

import * as dotenv from 'dotenv';

dotenv.config();

const port = process.env.PORT;
const dbHost = process.env.DB_HOST;
const apiKey = process.env.API_KEY;

console.log(`port: ${port}`);
console.log(`dbHost: ${dbHost}`);
console.log(`apiKey: ${apiKey}`);

tsconfig.json ファイルに env オプションを追加することで、環境変数を TypeScript の型システムで使用できます。

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "lib": [
      "es5",
      "dom",
      "es2015",
      "es2016",
      "es2017",
      "es2018",
      "es2019",
      "es2020",
      "es2021",
      "es2022",
      "esnext"
    ],
    "noImplicitAny": false,
    "strictNullChecks": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "rootDir": "./src",
    "outDir": "./dist",
    "baseUrl": "./src",
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "inlineSources": true,
    "removeComments": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "noImplicitThis": true,
    "strictFunctionTypes": true,
    "strictBindCallApply": true,
    "jsx": "react",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "target": "es5",
    "module": "commonjs",
    "lib": [
      "es5",
      "dom",
      "es2015",
      "es2016",
      "es2017",
      "es2018",
      "es2019",
      "es2020",
      "es2021",
      "es2022",
      "esnext"
    ],
    "noImplicitAny": false,
    "strictNullChecks": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "rootDir": "./src",
    "outDir": "./dist",
    "baseUrl": "./src",
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "inlineSources": true,
    "removeComments": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "noImplicitThis": true,
    "strictFunctionTypes": true,
    "strictBindCallApply": true,
    "jsx": "react",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "env": {
      "NODE_ENV": "development"
    }
  }
}

手動で型定義

process.env オブジェクトを直接型定義することもできます。

interface Env {
  PORT: number;
  DB_HOST: string;
  API_KEY: string;
}

const env: Env = process.env

node.js typescript


Node.jsサーバーをデーモンプロセス化する3つの方法:それぞれのメリットとデメリット

foreverモジュールは、Node. jsアプリケーションを永続的に実行するためのツールです。インストール方法は以下の通りです。インストール後、以下のコマンドを実行することで、Node. jsサーバーをデーモンプロセスとして起動できます。...


【超便利】Mongooseでコレクションを自在に操作!find、findOne、findById、count、aggregateの使い方を徹底解説

このチュートリアルでは、Mongoose を使用して既存の MongoDB コレクションにアクセスする方法を説明します。Mongoose は、Node. js 用の MongoDB オブジェクト モデリング ライブラリです。前提条件このチュートリアルを始める前に、以下の条件を満たしていることを確認してください。...


別ファイルのクラスを駆使してNode.jsアプリをレベルアップ! インクルードの極意

Node. jsでは、module. exportsとrequireという構文を用いて、別ファイルからのクラス定義をインクルードすることができます。クラスのエクスポートまず、エクスポートしたいクラスを定義したファイルを用意します。このファイルでは、module...


オブジェクトの参照渡しとコピーの違い

オブジェクトの浅いコピーを作成するには、Object. assign() メソッドを使用できます。 この方法は、オブジェクトのプロパティとその値を新しいオブジェクトにコピーしますが、ネストされたオブジェクトはコピーしません。この例では、originalObject のプロパティである name、age、address が clonedObject にコピーされています。 しかし、address プロパティはネストされたオブジェクトであるため、clonedObject の address プロパティは originalObject の address プロパティへの参照となります。...


【初心者向け】React/ReduxでTypeScriptエラー「Property "XXX" does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes'」が発生したときの対処法

このエラーは、TypeScriptとReact/Reduxの組み合わせで、コンポーネントに定義されていないプロパティを参照しようとしたときに発生します。具体的には、IntrinsicAttributes & IntrinsicClassAttributes 型に存在しないプロパティ XXX を参照しようとしています。...


SQL SQL SQL SQL Amazon で見る



Node.js開発で発生!process.env.NODE_ENVがundefinedになる謎を解き明かす

process. env. NODE_ENVがundefinedになる理由はいくつかあります。設定されていないデフォルトでは、process. env. NODE_ENVは設定されていません。開発環境ではdevelopment、本番環境ではproductionなど、適切な値を設定する必要があります。