Как вставить конфигурацию NestJS в объект TypeORM?
Давайте упростим сущность TypeORM User
:
@Entity()
export class User extends BaseDatabaseEntity {
@Column({
length: 255,
})
public firstName!: string;
@Column({ length: 60 })
@Exclude()
public password: string;
@BeforeUpdate()
@BeforeInsert()
private hashPassword(): void {
const tmpPassword = hashSync(
this.password + 'config.auth.password.secret',
genSaltSync(),
);
this.password = tmpPassword;
}
}
}
Мне нужно заменить config.auth.password.secret
с конфигурацией NestJS (пространство имен из ConfigService):
export default registerAs('app', () => {
return {
password: {
secret: process.env.AUTH_PASSWORD_SECRET,
}
};
});
, но сущности не являются частью структуры NestJS, поэтому я не могу просто внедрить их как обычно.
Как добиться конфигов NestJS в сущностях TypeORM?
3 ответа
Мне это тоже было нужно, и я нашел обходной путь. Вы не можете внедрить конфигурацию в Entity, как уже было сказано.
Я придумал решение для экспорта объекта со значениями конфигурации, которые мне нужны в Entities:
Инициализировать конфигурацию в модуле приложения:
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [defaultConfig]
}),
// .....other imports
]
defaultConfig
это функция, собирающая и проверяющая значения конфигурации. Вдобавок к этому он устанавливает значения вSTATIC_CONFIG
объект.
export const STATIC_CONFIG = {
WEB_APP_URL: '',
BASE_URL: '',
};
export const defaultConfig = () => {
const port = +(process.env[ENV_SERVER.PORT] || 3000);
const production = process.env.NODE_ENV === 'production';
const retVal = {
PRODUCTION: production,
PORT: port,
BASE_URL: process.env.BASE_URL || 'http://localhost:3000',
URL_PREFIX: process.env.URL_PREFIX || 'http://localhost:3000',
// ..... plenty of other values
}
if (retVal[ENV_S3.HOST] && !(retVal[ENV_S3.ACCESS] && retVal[ENV_S3.SECRET])) {
// tslint:disable-next-line:no-console
console.error('S3 configuration error: no access or secret set; exiting');
process.exit(1);
}
STATIC_CONFIG.WEB_APP_URL = retVal.WEB_APP_URL;
STATIC_CONFIG.BASE_URL = retVal.BASE_URL;
return retVal;
};
И, наконец, в своих сущностях я использую STATIC_CONFIG
объект, например:
@Expose({ name: 'image', toPlainOnly: true, groups: [TG_MOBILE] })
get mobileAppImage() {
return this.id ? `${STATIC_CONFIG.BASE_URL}/static/image/${this.id}` : undefined;
}
Сущности не являются частью внедряемых поставщиков в NestJS, поэтому по сути это невозможно. Однако вы можете сделать его частью своего служебного кода и выполнить хеширование пароля перед вставкой / обновлением.
@Entity()
export class User extends BaseDatabaseEntity {
@Column({
length: 255,
})
public firstName!: string;
@Column({
length: 60,
transformer: new PasswordTransformer(new ConfigService())
})
@Exclude()
public password: string;
}
export class PasswordTransformer implements ValueTransformer {
constructor(private config: ConfigService) {}
from(value: string): string {
return value;
}
to(value: string): string {
return hashSync(
this.password + this.config.get('AUTH_PASSWORD_SECRET'),
genSaltSync(),
);
}
}