ทำ configService ใน Nestjs

Supanut Laddayam
2 min readJun 26, 2022

--

จากที่ผมได้ทำ backend application มาได้สักระยะหนึ่ง พบว่าจะมีการวางการ set up / regist ค่าต่างๆ (ไม่ว่าจะเป็น argument ของlib, ค่า env และอื่นๆ) ใน module นั้น ทำให้ไฟล์ .module.ts มันรก และยากต่อการอ่าน ซึ่งผมก็ได้ไปเจอการทำ configService เลยอยากจะมาขอแชร์ในบทความนี้

Nestjs x configService

โดยในบทความนี้เราจะทำ config service มาใช้ในการอ้างถึงค่า env (process.env.) และการทำ set up ตัว TypeOrm ชนิด postgres

ขออนุญาตข้ามการ new project Nestjs ไปเลยนะครับ (สามารถไปอ่านได้จาก official doc ของ Nestjs)

github: https://github.com/Supanut1911/Cosebase-ConfigService-nestjs

Step1: สร้าง directory ชื่อ config ขึ้นมาใน root ของ src, จากนั้นสร้างไฟล์ config.service.ts เพื่อใช้ไฟล์นี้เป็นตัวเก็บ method ในการเรียกใช้ค่า config

make config-directory and create config.service.ts

Step2: install lib

npm install --save dotenvและ
npm install --save @nestjs/typeorm typeorm pg

lib ตัวแรกเป็นตัวที่ใช้ดึงค่าจากไฟล์ .env และ lib ที่สองเป็น typeOrm และ postgres

Step 3: Code ในไฟล์ config.service.ts

อธิบายโค้ด:

  • เริ่มที่ตัวแปร env ที่ constructor เป็นตัวแปร object ที่มี key เป็น string และ value เป็น string หรือ undefined กำหนดเพื่อให้เข้ากับค่าจากไฟล์ .env
  • ฟังก์ชัน getValue: จะรับ key และ throwOnMissing มีค่า default เป็น true เข้ามา และจะ return ค่าเป็น string โดยจะเป็นการเช็คค่า value ที่ดึกค่ามากจาก key ของ object env ถ้า =>ไม่มีค่า value (ค่าเป็น undifined) จะ thorw error ออกมาโดยบอกว่า key ที่ไม่มีค่าคือ key อะไร, แต่ถ้า => value มีค่า(ไม่เป็น undifined) ก็จะคือค่าออกไป
กรณีที่ค่า PG_HOST ไม่มี
  • ฟังก์ชัน ensureValue: รับ key ที่เป็น array of string และทำการ for เรียก getValue ก่อนหน้าโดยส่ง key เข้าไป

*โดยฟังก์ชันนี้ก็ตามชื่อเลยจะรับประกันว่าค่าใน env จะไม่เป็น undifined โดยทำงานร่วมกับฟังก์ชัน getValue

  • ฟังก์ชัน getPort(): ก็จะส่ง ‘PORT’ เข้าไปในฟังก์ชัน getValue เพื่อต้องการค่า PORT ที่ของไฟล์ env
  • ฟังก์ชัน isProduction(): ก็จะส่ง ‘MODE’ เข้าไปในฟังก์ชัน getValue เพื่อต้องการค่า MODE ที่ของไฟล์ env
  • ฟังก์ชัน getTypeOrmConfig(): จะเป็นการ setup option ของ typeOrm โดยประกอบไปด้วย argument ต่างๆ ไม่ว่าจะเป็น type, host, port, username, etc…

และ export เป็นตัวแปร configService ออกมาจากการ new object ConfigService

โดยค่า process.env ที่ดึงมาจะอ้างอิงจากไฟล์ .env

Step4: การทำ configService ไปใช้

  • configService.getPort(): นำค่า port ใน env มาใช้กำหนดค่า port ในการ run server (4000)
use getPort() from configService at main.ts
  • configService.getTypeOrmConfig(): นำ service มา regist แบบ forRoot ที่ app.module.ts เพื่อเป็นการ setup TypeOrm_PG
use configService.getTypeOrmConfig() set up typeOrm_PG at app.module.ts

ก็ประมาณนี้ครับสำหรับการทำ configService มาเป็น service กลางในการ setup lib และค่า env ต่าง ๆ ซึ่งหากมี feature อื่นๆ หรือ เพิ่มค่า env เพิ่มเติมก็สามารถใช้การทำ configService ช่วยได้

ขอบคุณครับ 😬🙏

--

--

No responses yet