如果您已经编码了一段时间,您就会知道环境变量的重要性及其所扮演的角色,以及找出由于项目中未设置该死的环境变量而导致的错误的痛苦, 哈哈!
今年早些时候,我在一家基于产品的初创公司担任全栈开发人员实习生。随着项目的增长,环境变量的数量也随之增加。而且,每个人都在不同的分支上开发不同的功能,所以我们不知道是否有人在他们的分支中引入了一些新的环境变量,这些变量后来被合并到主分支中。当我尝试部署我的分支时,这产生了问题,我知道一个新的环境变量已添加到项目中。
然后,后来我接触到了 T3 堆栈,它有一个出色的解决方案,可以为环境变量添加类型安全。我什至不知道存在这样的解决方案。在你最意想不到的时候学习新东西总是感觉很好。 T3 堆栈使用 zod 和 @t3-oss/env-nextjs 包为您的应用程序添加类型安全性,我非常喜欢。之后,我承诺无论如何都会保证我的环境变量的类型安全。
如果您正在开始一个新项目,或者已经在团队中工作,我强烈建议您向您的环境添加类型安全。仅添加此内容将节省您解决代码库中问题的精力。
以下是如何将其添加到您的项目中的方法。很简单。
Zod 是一个轻量级、快速的模式声明和验证库。架构可以是从简单字符串、数字到复杂对象类型的任何内容。
import {z} from 'zod'; const myBoolean = z.boolean(); myBoolean.parse('true'); // throws error myBoolean.parse(true) // valid
import { z } from 'zod'; const userSchema = z.object({ name: z.string(), age: z.number(), address: z.object({ house_no: z.string(), locality: z.string(), city: z.string(), state: z.string(), }) });
您可以创建简单的对象架构或创建嵌套对象架构。
它只是一个包,它将帮助我们为环境变量添加类型安全性
在项目的根目录创建一个 env.js 文件。
import {createEnv} from "@t3-oss/env-nextjs"; import {z} from "zod"; export const env = createEnv({ /* * Serverside Environment variables, not available on the client. * Will throw if you access these variables on the client. */ server: { DB_URI: z.string().url(), }, /* * Environment variables available on the client (and server). * * You'll get type errors if these are not prefixed with NEXT_PUBLIC_. */ client: { NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string().min(1), }, /* * Due to how Next.js bundles environment variables on Edge and Client, * we need to manually destructure them to make sure all are included in bundle. * * You'll get type errors if not all variables from `server` & `client` are included here. */ runtimeEnv: { DB_URI: process.env.DATABASE_URL, NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, }, });
import {env} from '@/env'; const CLERK_PUBLISHABLE_KEY = env.NEXT_PUBLISHABLE_KEY;
如果将光标悬停在 NEXT_PUBLISHABLE_KEY 上方,您可以看到该值被输入为字符串,这意味着我们的环境变量现在已输入。
我们添加了类型安全的环境变量,但这不会在每次构建时运行。我们必须将新创建的文件导入到 next.config.js 文件中。您可以使用 unjs/jiti 包。
首先,从 npm 安装 jiti pacakge。
import { fileURLToPath } from "node:url"; import createJiti from "jiti"; const jiti = createJiti(fileURLToPath(import.meta.url)); jiti("./app/env");
使用 import.meta.url 时,它提供您当前正在使用的文件的 URL。但是,它包含您可能不想要的 file:/// 前缀。要删除该前缀,您可以使用 node:url 模块中的 fileURLToPath 函数。
例如:
import {fileURLToPath} from 'node:url'; // Convert the file URL to a path const filename = fileURLToPath(import.meta.url);
现在,如果您没有所需的环境变量,您将看到这样的错误 -
import dotenv from "dotenv"; import { z } from "zod"; dotenv.config(); const schema = z.object({ MONGO_URI: z.string(), PORT: z.coerce.number(), JWT_SECRET: z.string(), NODE_ENV: z .enum(["development", "production", "test"]) .default("development"), }); const parsed = schema.safeParse(process.env); if (!parsed.success) { console.error( "❌ Invalid environment variables:", JSON.stringify(parsed.error.format(), null, 4) ); process.exit(1); } export default parsed.data;
在 Node.js 项目中,我们将简单地创建一个 zod 模式并根据 process.env 解析它,以检查是否设置了所有 env 变量。
import express from "express"; import env from "./env"; const app = express(); const PORT = env.PORT || 5000; // PORT is type safe here.... app.listen(PORT, () => { console.log("Connected to server on PORT ${PORT}"); connectDB(); });
这就是为环境变量添加类型安全的方法。我希望您在本教程中学到一些新东西。
快乐编码! ?
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3