typescript - چگونه میتوان کانفیگ 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 بهدست آورد؟
پاسخ شماره ۱
من هم به این نیاز داشتم و راهحلی پیدا کردم. همانطور که قبلاً گفته شد، نمیتوان کانفیگ را به Entity تزریق کرد.
من راه حلی برای صادر کردن شیء با مقادیر پیکربندی که در موجودیتها نیاز دارم ارائه دادم:
پیکربندی را در ماژول برنامه مقداردهی اولیه کنید:
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 نیستند، بنابراین به طور ذاتی این امکان وجود ندارد. با این حال، میتوانید آن را بخشی از کد سرویس خود کنید و هش کردن رمز عبور را قبل از درج/بهروزرسانی انجام دهید.
