Nest 的集成只是对 TypeORM 的 api 封装了一层。先安装 **<font style="color:rgb(37, 41, 51);">@nestjs/typeorm</font>**<font style="color:rgb(37, 41, 51);">、typeorm、mysql2</font>
使用方式是在根模块 **<font style="color:rgb(37, 41, 51);">TypeOrmModule.forRoot</font>**
传入数据源配置。该动态模块是全局模块。所以之后可在各处注入 <font style="color:rgb(37, 41, 51);">DataSource</font>
、<font style="color:rgb(37, 41, 51);">EntityManager</font>
来做增删改查了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import { TypeOrmModule } from "@nestjs/typeorm";
@Module({ imports: [ UserModule, TypeOrmModule.forRoot({ type: "mysql", host: "localhost", port: 3306, username: "root", password: "123456", database: "typeorm_test", synchronize: true, logging: true, entities: [User], poolSize: 10, connectorPackage: "mysql2", extra: { authPlugin: "sha256_password", }, }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
|
如果想用 Repository 来简化操作,还可以在用到的模块引入 **<font style="color:rgb(37, 41, 51);">TypeOrmModule.forFeature</font>**
的动态模块,传入 Entity,会返回对应的 Repository。
| @Module({ imports: [TypeOrmModule.forFeature([User])], controllers: [UserController], providers: [UserService], }) export class UserModule {}
|
这样就可以在模块内注入该 Repository 来用了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import { InjectEntityManager, InjectRepository } from "@nestjs/typeorm"; import { EntityManager, Repository } from "typeorm";
export class UserService { @InjectEntityManager() private manager: EntityManager;
@InjectRepository(User) private UserEntityManger: Repository<User>;
create(createUserDto: CreateUserDto) { this.manager.save(User, createUserDto); }
findAll() { return this.UserEntityManger.find(); }
findOne(id: number) { return this.manager.findOne(User, { where: { id } }); }
update(id: number, updateUserDto: UpdateUserDto) { this.manager.save(User, { id: id, ...updateUserDto }); }
remove(id: number) { this.manager.delete(User, id); } }
|
它的原理是 TypeOrmModule.forRoot 对应的动态模块是全局的,导出了 dataSource、entityManager,所以才可以到处注入。而 TypeOrmModule.forFeature 则会根据吧传入 Entity 对应的 Repository 导出,这样就可以在模块内注入了。