Как вставить конфигурацию 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(),
    );
  }
}

Другие вопросы по тегам