Den*_*kov 1 environment-variables node.js nestjs nestjs-config
我试图在“config.ts”的一个文件中设置所有配置,将其加载到 ConfigService,然后使用配置接口从中获取值。这是我的 config.ts,其中包含 .env 文件中的 ENV 变量和静态变量。
UPD:用这个例子制作了回购协议
import { Config } from './config.interface';
const config: Config = {
typeorm: {
type: 'postgres',
host: process.env.DB_HOST,
port: +process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
synchronize: process.env.NODE_ENV !== 'prod',
logging: true,
entities: [User, RefreshToken],
},
};
export default () => config;
Run Code Online (Sandbox Code Playgroud)
这是我的界面:
export interface Config {
typeorm: TypeOrmConfig;
}
export interface TypeOrmConfig {
type: string;
host: string;
port: number;
username: string;
password: string;
database: string;
synchronize: boolean;
logging: boolean;
entities: any[];
}
Run Code Online (Sandbox Code Playgroud)
配置被加载到app.module.ts中的ConfigModule中
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: '.dev.env',
load: [config],
}),
}),
Run Code Online (Sandbox Code Playgroud)
例如,我想使用此设置来设置我的 TypeOrmModule。基于 NestJs 文档
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => {
const config = configService.get<TypeOrmConfig>('typeorm');
console.log(config);
return {
type: config.type,
host: config.host,
port: +config.port,
username: config.username,
password: config.password,
database: config.database,
synchronize: config.synchronize,
logging: config.logging,
entities: config.entities,
};
},
inject: [ConfigService],
}),
Run Code Online (Sandbox Code Playgroud)
问题就在这里。配置中的静态值没问题,但我所有的 ENV 变量都未定义。这是console.log输出:
{
type: 'postgres',
host: undefined,
port: NaN,
username: undefined,
password: undefined,
database: undefined,
synchronize: true,
logging: true,
entities: [
[class User extends CoreEntity],
[class RefreshToken extends CoreEntity]
]
}
Run Code Online (Sandbox Code Playgroud)
我不明白未定义的 ENV 变量有什么问题,我将不胜感激任何解释和帮助
简而言之,NestJS 要求您为您尝试在此处访问的自定义配置“typeorm”定义一个命名空间(请参阅配置命名空间):
const config = configService.get<TypeOrmConfig>('typeorm');
Run Code Online (Sandbox Code Playgroud)
这意味着您必须使用registerAs函数来创建名称空间:
import { registerAs } from '@nestjs/config';
import { TypeOrmConfig } from './config.interface';
export default registerAs(
'typeorm',
(): TypeOrmConfig => ({
type: 'postgres',
host: process.env.DB_HOST,
port: +process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
synchronize: process.env.NODE_ENV !== 'prod',
logging: true,
entities: [],
}),
);
Run Code Online (Sandbox Code Playgroud)
这样就可以解决问题了。然而,我们可以对此进行改进。
您无需为 TypeORM 配置定义自己的接口,而是可以使用和/或扩展现有接口来减少样板代码(下面我提到,ConnectionOptions但TypeOrmModuleOptions根据您的配置需求可能更合适)。我还建议为环境变量提供后备值:
import { registerAs } from '@nestjs/config';
import { ConnectionOptions } from 'typeorm';
const CONNECTION_TYPE = 'postgres';
export default registerAs(
'typeorm',
(): ConnectionOptions => ({
type: CONNECTION_TYPE,
host: process.env.DB_HOST || 'default_value',
port: +process.env.DB_PORT || 3000,
username: process.env.DB_USERNAME || 'default_value',
password: process.env.DB_PASSWORD || 'default_value',
database: process.env.DB_NAME || 'default_value',
synchronize: process.env.NODE_ENV !== 'prod',
logging: true,
entities: [],
}),
);
Run Code Online (Sandbox Code Playgroud)
此外,无需再次显式地将配置值分配给 TypeOrmModule,因为您可以简单地:
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) =>
await configService.get('typeorm'),
inject: [ConfigService],
}),
Run Code Online (Sandbox Code Playgroud)
作为个人风格,我喜欢创建配置枚举来包含配置名称以防止拼写错误。考虑一下:
export enum ConfigEnum {
TYPEORM = 'typeorm',
}
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) =>
await configService.get<Promise<TypeOrmModuleOptions>>(
ConfigEnum.TYPEORM,
),
inject: [ConfigService],
})
Run Code Online (Sandbox Code Playgroud)
异步/等待模式在这里也是多余的,因为我们实际上并不执行任何异步操作,所以这也可以工作:
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: (configService: ConfigService) =>
configService.get<TypeOrmModuleOptions>(ConfigEnum.TYPEORM),
inject: [ConfigService],
})
Run Code Online (Sandbox Code Playgroud)
诗。我已经提出了拉取请求,请参阅https://github.com/JustDenP/nest-config/pull/1
| 归档时间: |
|
| 查看次数: |
8426 次 |
| 最近记录: |