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 "
