1) 装依赖
$ npm i --save dotenv
$ npm i --save-dev @types/dotenv
$ npm install --save joi
$ npm install --save-dev @types/joi
2) 创建文件
λ nest g mo config 创建一个config模块
CREATE /src/config/config.module.ts (83 bytes)
λ nest g s config 创建一个服务
CREATE /src/config/config.service.spec.ts (460 bytes)
CREATE /src/config/config.service.ts (90 bytes)
λ mkdir .env 在项目根目录创建
3) 编写代码
config.service.ts
import * as dotenv from 'dotenv';
import * as Joi from 'joi';
import * as fs from 'fs';
export interface EnvConfig {
[key: string]: string;
}
export class ConfigService {
private readonly envConfig: EnvConfig;
constructor(filePath: string) {
const config = dotenv.parse(fs.readFileSync(filePath));
this.envConfig = this.validateInput(config);
}
/**
* 确保设置所有需要的变量,并返回经过验证的JavaScript对象
* 包括应用的默认值。
*/
private validateInput(envConfig: EnvConfig): EnvConfig {
const envVarsSchema: Joi.ObjectSchema = Joi.object({
NODE_ENV: Joi.string()
.valid(['development', 'production', 'test', 'provision'])
.default(''),
SERVER_PORT: Joi.number().default(3000),
});
const { error, value: validatedEnvConfig } = Joi.validate(
envConfig,
envVarsSchema,
);
if (error) {
throw new Error(`Config validation error: ${error.message}`);
}
return validatedEnvConfig;
}
get port(): number {
return Number(this.envConfig.SERVER_PORT);
}
}
config.module.ts
import { Module } from '@nestjs/common';
import { ConfigService } from './config.service';
@Module({
providers: [
{
provide: ConfigService,
// useValue: new ConfigService(`${process.env.NODE_ENV}.env`),
useValue: new ConfigService(`.env`),
},
],
exports: [ConfigService],
})
export class ConfigModule {}
app.module.ts 导入ConfigModule
import { Module } from '@nestjs/common';
import { ConfigModule } from './config/config.module';
@Module({
imports: [ConfigModule],
})
export class AppModule {}
".env"
SERVER_PORT = 3000
4) 使用
@Injectable()
export class AppService {
constructor(public readonly config: ConfigService) {}
weekVideo() {
console.log(this.config.port); // 3000
return [];
}
}




