TypeORM 实战篇:在 NestJS 项目中集成 TypeORM

74 阅读2分钟

创建个 Nest 项目

nest new nest-typeorm -p npm

image-20251026184715327.png


创建一个 crud 的模块:

nest g resource user

image-20251026184822698.png


引入 typeorm

npm install --save @nestjs/typeorm typeorm mysql2

修改 app.modules.ts

image-20251026185947196.png

forRoot 方法解析

forRoot、register、forFeature 这三个是注册动态模块的三种方式

  • forRoot 用于在根模块(AppModule) 中注册一个模块的全局配置。通常只调用一次,用于创建全局单例。上述配置就是告诉 NestJS 启动时要创建一个 TypeORM 连接。

  • registerforRoot 类似,通常用于需要“多实例”多次调用或“局部配置”的场景。

    @Module({
      imports: [
        CacheModule.register({ ttl: 5 }),    // A模块
        CacheModule.register({ ttl: 60 }),   // B模块
      ],
    })
    
  • forFeature 通常用于那些支持模块分片加载的库模块, 例如:TypeOrmModuleMongooseModule。这些模块一般通过 forRoot 注册全局连接,再通过 forFeature 注册具体的实体(Entity)或模型(Model)。

    @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

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

image-20251026193540895.png

增删改查

修改 user.service.ts 来完成对数据库的增删改查操作。

通过在 UserService 注入 EntityManager 来完成对应操作。

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 进行新增操作

image-20251026195344170.png

服务端可以看到对应日志

image-20251026195422302.png


查询所有

image-20251026195725011.png

查询单个

image-20251026195922187.png


修改

image-20251026200345445.png


删除

image-20251026200745235.png


优化

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

image-20251026201043453.png

这个时候可以通过前边提到的 forFeature 来做一个优化。

在 user.module.ts 中做对应修改: 在 user 模块引入 TypeOrmModule.forFeature 对应的动态模块,传入 User 的 Entity

image-20251026201343742.png

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

image-20251026201853541.png