🔑
Node.jsで環境変数を型安全に扱う
Node.jsで process.env
を用いて環境変数を設定することはあるかと思いますが、このようなコードを書くとスペルを間違えるかもやしれません。
console.log(process.env.PROMPTON_GOOGLE_CLINET_EMAIL)
ちなみにCLIENT
をCLINET
と書いています。
更にはこのように型のエラーを回避してしまうのも悲しいですね。
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)
より安全に環境変数を取り扱いたい場合は、このようなライブラリがあります。
Discussion