TypeORM

1. NestJS + TypeORM 概述

  • TypeORM 在 NestJS 项目中的作用
  • 为什么选择 TypeORM(支持装饰器、Active Record 和 Data Mapper、关系管理等)

2. 项目初始化

  • 使用 Nest CLI 创建一个新的 NestJS 项目:
nest new nest-typeorm-example
  • 安装 TypeORM 和数据库驱动(以 PostgreSQL 为例):
npm install @nestjs/typeorm typeorm pg

3. 配置数据库连接

  • app.module.ts 中配置 TypeORM:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'password',
      database: 'nestjs_typeorm',
      autoLoadEntities: true,
      synchronize: true, // 生产环境建议禁用
    }),
  ],
})
export class AppModule {}

4. 创建实体(Entities)

  • 使用装饰器定义数据模型:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column({ unique: true })
  email: string;

  @Column()
  password: string;
}

5. 创建 Service 和 Repository

  • users 模块中使用 TypeOrmModule.forFeature()
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService],
  controllers: [UsersController],
})
export class UsersModule {}
  • users.service.ts 中使用 Repository 进行 CRUD 操作:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }

  findOne(id: number): Promise<User> {
    return this.usersRepository.findOneBy({ id });
  }

  create(user: User): Promise<User> {
    return this.usersRepository.save(user);
  }

  async remove(id: number): Promise<void> {
    await this.usersRepository.delete(id);
  }
}

6. 创建 Controller

  • users.controller.ts 中定义 API 路由:
import { Controller, Get, Post, Body, Param, Delete } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './user.entity';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll(): Promise<User[]> {
    return this.usersService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string): Promise<User> {
    return this.usersService.findOne(Number(id));
  }

  @Post()
  create(@Body() user: User): Promise<User> {
    return this.usersService.create(user);
  }

  @Delete(':id')
  remove(@Param('id') id: string): Promise<void> {
    return this.usersService.remove(Number(id));
  }
}

7. 数据迁移

  • 生成迁移文件:
npm run typeorm migration:generate -- -n CreateUserTable
  • 运行迁移:
npm run typeorm migration:run

8. 进阶功能

关系管理

  • OneToOneOneToManyManyToMany 关系的使用。

使用 DTO 进行数据验证

  • 利用 class-validatorclass-transformer 进行数据验证。

使用事务

  • EntityManagerQueryRunner 实现事务处理。

苏ICP备2025153828号