创建个 Nest 项目
bash
nest new nest-typeorm -p npm

创建一个 crud 的模块:
bash
nest g resource user

引入 typeorm
bash
npm install --save @nestjs/typeorm typeorm mysql2
修改 app.modules.ts

forRoot 方法解析
forRoot、register、forFeature 这三个是注册动态模块的三种方式。
-
forRoot用于在**根模块(AppModule)**中注册一个模块的全局配置。通常只调用一次,用于创建全局单例。上述配置就是告诉 NestJS 启动时要创建一个 TypeORM 连接。 -
register和forRoot类似,通常用于需要"多实例"多次调用或"局部配置"的场景。ts@Module({ imports: [ CacheModule.register({ ttl: 5 }), // A模块 CacheModule.register({ ttl: 60 }), // B模块 ], }) -
forFeature通常用于那些支持模块分片加载的库模块 , 例如:TypeOrmModule、MongooseModule。这些模块一般通过forRoot注册全局连接,再通过forFeature注册具体的实体(Entity)或模型(Model)。ts@Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', username: 'root', password: '123456', database: 'test', synchronize: true, }), TypeOrmModule.forFeature([User]), // 注册实体 ], providers: [UserService], }) export class UserModule {}
修改 User Entity
ts
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity({
name: 'sanshi_user',
})
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({
name: 'sanshi_name',
length: 50,
})
name: string;
}
执行 npm run start

增删改查
修改 user.service.ts 来完成对数据库的增删改查操作。
通过在 UserService 注入 EntityManager 来完成对应操作。
ts
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { InjectEntityManager } from '@nestjs/typeorm';
import { EntityManager } from 'typeorm';
import { User } from './entities/user.entity';
@Injectable()
export class UserService {
@InjectEntityManager()
private manager: EntityManager;
create(createUserDto: CreateUserDto) {
return this.manager.save(User, createUserDto);
}
findAll() {
return this.manager.find(User);
}
findOne(id: number) {
return this.manager.findOne(User, { where: { id } });
}
update(id: number, updateUserDto: UpdateUserDto) {
return this.manager.save(User, { id, ...updateUserDto });
}
remove(id: number) {
return this.manager.delete(User, { id });
}
}
执行 npm run start:dev。
通过 postman 进行新增操作

服务端可以看到对应日志

查询所有

查询单个

修改

删除

优化
因为使用的是通过 @InjectEntityManager 来注入的 entityManager 对象,所以每个 api 都需要带上对应的 Entity。

这个时候可以通过前边提到的 forFeature 来做一个优化。
在 user.module.ts 中做对应修改: 在 user 模块引入 TypeOrmModule.forFeature 对应的动态模块,传入 User 的 Entity。

然后在 userService 中就可以注入 Repository,从而使用各个 api 的时候就不需要单独传入 User Entity 了。
