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. 进阶功能
关系管理
OneToOne
、OneToMany
、ManyToMany
关系的使用。
使用 DTO 进行数据验证
- 利用
class-validator
和 class-transformer
进行数据验证。
使用事务
EntityManager
和 QueryRunner
实现事务处理。