🔑

Node.jsで環境変数を型安全に扱う

2024/03/06に公開

Node.jsで process.env を用いて環境変数を設定することはあるかと思いますが、このようなコードを書くとスペルを間違えるかもやしれません。

console.log(process.env.PROMPTON_GOOGLE_CLINET_EMAIL)

ちなみにCLIENTCLINETと書いています。

更にはこのように型のエラーを回避してしまうのも悲しいですね。

console.log(process.env.PROMPTON_GOOGLE_CLIENT_EMAIL + "")
console.log(process.env.PROMPTON_GOOGLE_CLIENT_EMAIL!)

Zodで検証する

そこでZodで環境変数の値を検証します。

import { z } from "zod"

const keys = [
  "AES_PASSWORD",
  "AES_SALT",
  "CLOUD_RUN_URL",
  "DATABASE_URL",
  "FIREBASE_PROJECT_ID",
  "FIREBASE_STORAGE_BUCKET",
  "GOOGLE_CLIENT_EMAIL",
  "GOOGLE_PRIVATE_KEY",
]

const entries = keys.map((key) => [key, z.string().min(1)])

const zEnv = z.object<Record<(typeof keys)[number], z.ZodString>>(
  Object.fromEntries(entries),
)

export function env() {
  return zEnv.parse(process.env)
}

このように使用できます。

import { env } from "@/lib/env"

env().GOOGLE_CLIENT_EMAIL // Typesafe!

ちなみに、このように書かない理由ですが、これだとActionsやCloudBuildなどのビルド時に環境変数が不足してエラーになる可能性があります。

export const env = zEnv.parse(process.env)

t3 Env

Next.jsやViteのクライアントサイドでも process.env を参照できる機能がありますが、その場合はこのような書き方は出来ないので注意です。

zEnv.parse(process.env)

より安全に環境変数を取り扱いたい場合は、このようなライブラリがあります。

https://github.com/t3-oss/t3-env

Aipictors

Discussion