ทำ configService ใน Nestjs
จากที่ผมได้ทำ backend application มาได้สักระยะหนึ่ง พบว่าจะมีการวางการ set up / regist ค่าต่างๆ (ไม่ว่าจะเป็น argument ของlib, ค่า env และอื่นๆ) ใน module นั้น ทำให้ไฟล์ .module.ts มันรก และยากต่อการอ่าน ซึ่งผมก็ได้ไปเจอการทำ 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
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) ก็จะคือค่าออกไป
- ฟังก์ชัน 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)
- configService.getTypeOrmConfig(): นำ service มา regist แบบ forRoot ที่ app.module.ts เพื่อเป็นการ setup TypeOrm_PG
ก็ประมาณนี้ครับสำหรับการทำ configService มาเป็น service กลางในการ setup lib และค่า env ต่าง ๆ ซึ่งหากมี feature อื่นๆ หรือ เพิ่มค่า env เพิ่มเติมก็สามารถใช้การทำ configService ช่วยได้
ขอบคุณครับ 😬🙏