2023/10/21-node-20-env-with-confident preview

ลองใช้ Built-in env file ใน Node 20 แถมการ validate env ด้วย zod

ก่อนหน้านี้การทำงานกับ .env file บน nodejs เราจะต้องใช้แพ็กเพจที่ชื่อว่า dotenv ช่วย เพราะเค้าเขียนมาดี จัดการการอ่าน config อะไรให้หมด จบในแพ็กเกจเดียว

แต่ใน Node 20 ที่กำลังจะ Release ในวันที่ 24 ตุลานี้ เค้ามี Built-in env file มาให้โดยไม่ต้องติดตั้งอะไรเพิ่ม ก็เลยอยากมาลองใช้ดูว่าแจ่มแมวมั้ย ประหยัด package ที่ต้อง maintain version ไปอีกหนึ่ง

เริ่มกันเลย

ก่อนอื่น ติดตั้ง Node 20 ก่อน

เราใช้ volta ในการจัดการ Node version

mkdir node-20-env
cd node-20-env
npm init -y
volta pin node@20
touch index.js

ยาวหน่อย แต่สรุปก็คือ สร้างโฟลเดอร์สำหรับโปรเจคใหม่ initialize npm package และปัก node@20 เป็น node version ที่เราจะใช้ในโปรเจคนี้ด้วย volta นั่นเอง

ใครยังไม่เคยใช้หรือยังไม่รู้จัก volta ตามไปอ่านได้ที่นี่

สร้าง env file

# .env
PORT=3000
APP_NAME=Node 20 with built-in env file

เตรียมฟังก์ชั่นสำหรับเอาค่าจาก env มาใช้ในแอพ

ในครั้งที่เราจะใช้ zod มาช่วยในการทำ env validation เพื่อให้เรามั่นใจจริงๆ ว่า env ที่แอพจะนำไปใช้นั้นถูกต้องจริงๆ

ก่อนอื่นก็ต้องติดตั้ง zod ก่อน

npm i zod

จากนั้นเขียนฟังก์ชั่นสำหรับอ่านและ validate env

// env.js

import { z } from "zod";

/**
 * @typedef {object} Env
 * @property {string} APP_NAME
 * @property {number} PORT
 */
export const envSchema = z.object({
  APP_NAME: z.string(),
  PORT: z.string().regex(/^\d+$/).transform(Number),
});

/**
 * @type {Env}
 */
export const env = envSchema.parse(process.env);

หลังๆ มาถ้าเป็นโปรเจคส่วนตัวไม่ได้ทำงานร่วมกับใคร ผมจะใช้เพียง JavaScript เพราะขี้เกียจ แต่จะใช้ JSDoc เขียนกำกับเอาไว้แทน สะดวกดี

จากนั้นใน index.js ที่เราสร้างเอาไว้ตอนต้น ให้เรา import env มาใช้งาน

// index.js

import { env } from "./env.js";

function main() {
  console.log("Hello, this is ", env.APP_NAME, " running on port ", env.PORT);
}

main();

ลองรันดู

node --env-file=.env index.js

ผลลัพธ์ที่ได้

Hello, this is  Node 20 with built-in env file  running on port  3000

เซ็ท scripts ใน package.json

{
  "scripts": {
    "start": "node --env-file=.env index.js"
  }
}

ลองรันดูอีกที

npm start

ผลลัพธ์ที่ได้

Hello, this is  Node 20 with built-in env file  running on port  3000

สรุป

เป็นไงบ้างกับความสามารถของ Node 20 สะดวกเลยใช่มั้ยล่ะ เท่าที่ใช้งานเบื้องต้นแบบไม่มีท่าพิศดาร ก็ยังไม่เจอข้อจำกัดอะไร แต่ยังไม่ได้ลองการใช้งานอื่นๆด้วย เช่น อ่าน env หลายๆ ไฟล์ได้หรือมั้ย การ merge env files จัดการยังไง

ยังไงก็นำไปทดลองใช้งานดู ขอให้สนุกกับการเขียนโค้ดครับ

← ใช้ Honojs กับ Cloudflare Pages Functions ทำ Transaction ใน redis ด้วย MULTI และ WATCH →