」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼應該始終向環境變數添加類型安全性?

為什麼應該始終向環境變數添加類型安全性?

發佈於2024-11-08
瀏覽:544

一點背景

如果您已經編碼了一段時間,您就會知道環境變數的重要性及其所扮演的角色,以及找出由於專案中未設定該死的環境變數而導致的錯誤的痛苦, 哈哈!

今年早些時候,我在一家基於產品的新創公司擔任全端開發人員實習生。隨著專案的成長,環境變數的數量也隨之增加。而且,每個人都在不同的分支上開發不同的功能,所以我們不知道是否有人在他們的分支中引入了一些新的環境變量,這些變量後來被合併到主分支中。當我嘗試部署我的分支時,這產生了問題,我知道一個新的環境變數已新增到專案中。

然後,後來我接觸到了 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(),
    })
});

您可以建立簡單的物件架構或建立嵌套物件架構。

什麼是 t3-oss/env-nextjs?

它只是一個包,它將幫助我們為環境變數添加類型安全性

讓我們建立類型安全的環境變數

在專案的根目錄中建立一個 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);

現在,如果您沒有所需的環境變量,您將看到這樣的錯誤 -

Why you should always add type safety to your environment variables?

如何為 Node.js 專案中的環境變數新增類型安全性?

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();
});

這就是為環境變數添加類型安全的方法。我希望您在本教程中學到一些新東西。

快樂編碼! ?

版本聲明 本文轉載於:https://dev.to/shaancodes/why-you-should-always-add-type-safety-to-your-environment-variables-24lk?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用 jQuery 偵測鍵盤 Enter 按下:綜合指南
    如何使用 jQuery 偵測鍵盤 Enter 按下:綜合指南
    使用 jQuery 檢測鍵盤 Enter 按下:綜合指南檢測使用者輸入對於建立互動式 Web 應用程式至關重要。一項常見任務是捕捉 Enter 按鍵。本文探討如何使用 jQuery 無縫地實現這一點,並解決了瀏覽器相容性的問題。 jQuery 解決方案jQuery 提供了一個名為 keypress(...
    程式設計 發佈於2024-11-08
  • 字串與字串
    字串與字串
    細繩 小寫字串是JavaScript中的原始資料型別。 用這種類型建立的字串不是對象,但 JavaScript 會自動用 String 物件包裝它們(這稱為「裝箱」)。 let imAString = "hello"; console.log(typeof imAString)...
    程式設計 發佈於2024-11-08
  • 如何在 C++ 和 Python 中右對齊輸出字串?
    如何在 C++ 和 Python 中右對齊輸出字串?
    右對齊格式化輸出字串處理文字檔案時,一致地對齊資料可以增強可讀性和分析能力。在 C 中,出現了一個問題:如何才能格式化右對齊的輸出字串? 使用Python 的格式化語法,解決方案很簡單:line_new = '{:>12} {:>12} {:>12}'....
    程式設計 發佈於2024-11-08
  • 黑客啤酒節第二週
    黑客啤酒節第二週
    第二週,我必須花更少的時間尋找問題。這次是 Mattermost 文件網站在深色模式下發生的錯誤,其中特定按鈕的顏色不正確。 我知道 Docusaurus,因為我看過其他文件和基於它構建的一些課程材料網站。它在底層使用了 React,所以我很熟悉它。但這個文檔網站是用 Python 寫的。雖然我不...
    程式設計 發佈於2024-11-08
  • Python 中的 Try/Except 與 If/Else:哪種方法比較有效?
    Python 中的 Try/Except 與 If/Else:哪種方法比較有效?
    Try/Except 與 If/Else:哪一種方法較可取? 在 Python 中處理異常時,開發人員經常面臨困境是否測試有效性或嘗試某項操作並處理任何產生的異常。本文深入探討了每種方法的細微差別,為決策提供指導和範例。 嘗試/除外:擁抱例外根據 PEP 20,錯誤除非明確地保持沉默,否則絕不應悄無...
    程式設計 發佈於2024-11-08
  • Git 遠端分支
    Git 遠端分支
    本週我們必須在另一個人的儲存庫中添加一個功能。具體來說,我們需要在使用者的 $HOME 資料夾中新增一個預設配置 TOML 文件,其中包含 CLI 工具的預設參數。我已為 readMeMaker 儲存庫做出了貢獻: https://github.com/jadorotan/readMeMaker.g...
    程式設計 發佈於2024-11-08
  • 對於簡單的操作,流總是比傳統集合慢嗎?
    對於簡單的操作,流總是比傳統集合慢嗎?
    Java 8 流性能對比傳統集合您最近涉足Java 8 並進行了非正式基準測試,以將其Stream API 與經典集合的表現進行比較。您的測試涉及過濾整數列表、提取偶數的平方根並將結果儲存在 Double 列表中。然而,您質疑測試的有效性,並渴望澄清真正的效能影響。 評估基準測試您的初步結果,表明流...
    程式設計 發佈於2024-11-08
  • 語言 API,允許您添加您的母語。
    語言 API,允許您添加您的母語。
    早在2016 年4 月,我就有了為一個我非常喜歡的部落“Igede Language”創建一個字典項目的想法,我決定將其稱為“Igede Dictionary ”,儘管我不是“ t 是母語人士。 這讓我撰寫並翻譯了 5,000 多個單詞,從 Igede 語言翻譯成英語。毫無疑問,這是我曾經研究過或擁...
    程式設計 發佈於2024-11-08
  • 使用 Playwright、TypeScript 和 JavaScript 進行自動化
    使用 Playwright、TypeScript 和 JavaScript 進行自動化
    剧作家与 TypeScript | JavaScript 安装 Playwright 是 Microsoft 与 Puppeteer 团队合作推出的基于 Web 的现代 API 自动化工具,Puppeteer 是一个 JavaScript 库,它提供高级 API 来通过 DevTools 协议或 W...
    程式設計 發佈於2024-11-08
  • Python 中的整數有幾個位元?
    Python 中的整數有幾個位元?
    計算整數的位數在Python中,整數沒有固有的長度概念。但是,如果您需要確定整數中的位數,可以考慮以下幾種方法。 轉換為字串一個簡單的方法是將整數轉換為字串,然後計算結果字串的長度。例如:length = len(str(123))這種方法很簡單,但需要將整數轉換為字串的中間步驟。 使用對數另一個...
    程式設計 發佈於2024-11-08
  • 為什麼使用 Z-Index 時我的偽元素會出現在標題元素上方?
    為什麼使用 Z-Index 時我的偽元素會出現在標題元素上方?
    Z-Index 與偽元素:案例研究在CSS 中,z-index 屬性指定元素的堆疊順序頁面,確定哪些元素出現在其他元素“前面”或“後面”。然而,當涉及偽元素時,例如 ::before 或 ::after,它們與 z-index 的交互有時可能不那麼簡單。 考慮一個場景,我們使用::before 偽元...
    程式設計 發佈於2024-11-08
  • 如何在剝離標籤之前刪除頑固的 HTML 特殊字元?
    如何在剝離標籤之前刪除頑固的 HTML 特殊字元?
    去除頑固的HTML 特殊字符strip_tags 函數雖然擅長刪除HTML 標籤,但無法處理討厭的HTML 特殊字符,例如用於不間斷空格或© 用於版權符號。這可能是創建乾淨 RSS 來源的絆腳石。 要解決此問題,請考慮使用以下策略之一:HTML 實體解碼:在字串經過strip_tags 之前,使用h...
    程式設計 發佈於2024-11-08
  • 如何在 Go 中解密 AES ECB 模式加密?
    如何在 Go 中解密 AES ECB 模式加密?
    Go 中的AES ECB 加密Go 中的AES ECB 加密package main import ( "crypto/aes" "fmt" ) func decryptAes128Ecb(data, key []byte) []byte { ...
    程式設計 發佈於2024-11-08
  • PHP 會話管理中的 session_unset() 和 session_destroy() 有什麼不同?
    PHP 會話管理中的 session_unset() 和 session_destroy() 有什麼不同?
    揭示PHP 中session_unset() 和session_destroy() 的獨特作用在PHP 會話管理領域,出現了兩個關鍵函數: session_unset() 和session_destroy()。雖然它們似乎都圍繞著會話資料操作,但它們的功能和效果卻顯著不同。 1。理解差異根據 PHP...
    程式設計 發佈於2024-11-08
  • 使用 Vue jsx 進行動態佈局:靈活且可維護的 UI 指南
    使用 Vue jsx 進行動態佈局:靈活且可維護的 UI 指南
    Written by Dubem Izuorah Have you ever spent hours tweaking the same web layout across multiple pages or struggled to make your UI adapt to changing ...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3