在NestJS中使用TypeORM时,可以通过使用自定义装饰器和依赖注入来向实体注入NestJS配置。以下是一种实现方式:
首先,创建一个自定义装饰器InjectConfig
,用于标记需要注入配置的实体类。在inject-config.decorator.ts
文件中编写以下代码:
import { SetMetadata } from '@nestjs/common';
export const InjectConfig = (configKey: string) => SetMetadata('configKey', configKey);
然后,在实体类中使用InjectConfig
装饰器来标记需要注入配置的属性。例如,在user.entity.ts
文件中的User
实体类中,我们想要注入一个名为database
的配置,可以这样写:
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
import { InjectConfig } from './inject-config.decorator';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@InjectConfig('database')
@Column()
database: string;
}
接下来,创建一个自定义的TypeORM连接选项提供者TypeOrmConfigProvider
,用于获取NestJS配置中的TypeORM配置。在typeorm-config.provider.ts
文件中编写以下代码:
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm';
@Injectable()
export class TypeOrmConfigProvider implements TypeOrmOptionsFactory {
constructor(private readonly configService: ConfigService) {}
createTypeOrmOptions(): TypeOrmModuleOptions {
return {
type: 'mysql',
host: this.configService.get('database.host'),
port: this.configService.get('database.port'),
username: this.configService.get('database.username'),
password: this.configService.get('database.password'),
database: this.configService.get('database.name'),
entities: [__dirname + '/../**/*.entity{.ts,.js}'],
synchronize: true,
};
}
}
在上述代码中,我们使用ConfigService
来获取NestJS配置中的数据库相关配置。
最后,在NestJS的模块中,将TypeOrmConfigProvider
添加到TypeOrmModule.forRoot()
的providers
数组中,并在TypeOrmModule.forRoot()
的imports
中引入ConfigModule
。例如,在app.module.ts
文件中的AppModule
模块中,可以这样写:
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TypeOrmConfigProvider } from './typeorm-config.provider';
import { User } from './user.entity';
@Module({
imports: [
ConfigModule.forRoot(),
TypeOrmModule.forRootAsync({
useClass: TypeOrmConfigProvider,
}),
TypeOrmModule.forFeature([User]),
],
})
export class AppModule {}
通过以上步骤,我们成功地向TypeORM实体注入了NestJS配置。在User
实体类中,我们使用了InjectConfig
装饰器来标记需要注入的配置属性,并在TypeOrmConfigProvider
中获取NestJS配置中的TypeORM配置。
请注意,以上代码中的database
配置仅作为示例,你可以根据实际需求修改和扩展。
关于TypeORM和NestJS的更多详细信息和用法,请参考以下链接:
领取专属 10元无门槛券
手把手带您无忧上云