Nest 中使用 TypeORM

Nest 的集成只是对 TypeORM 的 api 封装了一层。先安装 **<font style="color:rgb(37, 41, 51);">@nestjs/typeorm</font>**<font style="color:rgb(37, 41, 51);">、typeorm、mysql2</font>

1

使用方式是在根模块 **<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

1
2
3
4
5
6
@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 导出,这样就可以在模块内注入了。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!