ค้นหาเว็บไซต์

javascript - การกำหนดสภาพแวดล้อมของ Node ใน Nest.js


ฉันกำลังอยู่ในกระบวนการตั้งค่าโปรเจกต์ Nest.js และฉันกำลังมองหาวิธีที่มีประสิทธิภาพในการกำหนดสภาพแวดล้อมของ Node ซึ่งถูกใช้โดย ConfigService สำหรับการโหลดตัวแปรสภาพแวดล้อม:

import { Module } from '@nestjs/common';
import { ConfigService } from './config.service';

@Module({
    providers: [
        {
            provide: ConfigService,
            useValue: new ConfigService(`environments/${process.env.NODE_ENV}.env`)
        }
    ],
    exports: [ConfigService]
})
export class ConfigModule {}

ตอนนี้ฉันกำลังกำหนดมันโดยตรงในสคริปต์ npm (ตัวอย่างเช่น "start:dev": "NODE_ENV=development nodemon") แต่ฉันสงสัยว่ามีวิธีที่ดีกว่านี้ในการจัดการสภาพแวดล้อมที่แตกต่างกันแทนการต่อท้ายในทุกสคริปต์หรือไม่?

คำตอบ #1

การพัฒนา

ถ้ามันควรจะเป็น development เสมอ ให้ตั้งเป็นตัวแปรระบบ ดู Production/Staging ด้านล่าง หากคุณต้องการรันสภาพแวดล้อมที่แตกต่างกันระหว่างการพัฒนา การต่อท้ายสคริปต์ npm run ของคุณคือวิธีที่จะทำ นอกจากนี้คุณยังสามารถใช้ cross-env เพื่อให้แน่ใจว่าสคริปต์ของคุณทำงานได้บนแพลตฟอร์มที่แตกต่างกัน:

"start": "cross-env NODE_ENV=development ts-node -r tsconfig-paths/register src/main.ts",

กำลังทดสอบ

ถ้าคุณต้องการรันการทดสอบการรวมของคุณในสภาพแวดล้อมที่แตกต่าง คุณสามารถตั้งค่าได้ใน jest-e2e.json ของคุณ:

"globals": {
  "NODE_ENV": "test"
}

การตั้งค่า (หรือเปลี่ยน) สภาพแวดล้อมของคุณสำหรับการทดสอบเฉพาะหนึ่งครั้งก็สามารถทำได้ในโค้ดทดสอบ:

let previousNodeEnv;
beforeAll(() => {
  previousNodeEnv = process.env.NODE_ENV;
  process.env.NODE_ENV = 'test';
});

afterAll(() => process.env.NODE_ENV = previousNodeEnv);

การผลิต/การจัดเวที

บนระบบสเตจหรือระบบการผลิต ผมขอแนะนำให้ตั้งมันเป็นตัวแปรระบบปกติ ดูที่กระทู้นี้

คำตอบ #2

โดยไม่มี cross-env คุณสามารถใช้:

"start:local": "NODE_ENV=test ts-node -r tsconfig-paths/register src/main.ts "

บทความที่เกี่ยวข้อง