Nest 集成 TypeORM

TypeORM 基础回顾

  • DataSource 配置:包含数据库连接的详细信息,如用户名、密码、驱动、连接池等。
  • Entity 映射:利用装饰器(如 @Entity, @PrimaryGeneratedColumn, @Column)定义数据库表结构。
  • 关系映射:通过 @OneToOne, @OneToMany, @ManyToMany 等装饰器定义表间关系。
  • 初始化与操作:DataSource.initialize 建立连接和表,EntityManager 负责实体的 CRUD 操作。

nest 结合 typeorm

初始化环境

创建 Nest 项目:

bash 复制代码
nest new nest-typeorm -p npm

然后创建一个 crud 的模块:

bash 复制代码
nest g resource user

引入 mysql、typeorm:

bash 复制代码
npm install @nestjs/typeorm typeorm mysql2

@nestjs/typeorm 就是把 typeorm api 封装了一层。

引入动态模块 TypeOrmModule,使用 forRoot 方法进行全局注册,只需配置一次即可在任何地方使用,TypeOrmModule 是全局模块,这样就无需在每个模块中重复导入:

typescript 复制代码
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { User } from './user/entities/user.entity';
import { UserModule } from './user/user.module';

@Module({
  imports: [
    UserModule,
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'xxx',
      database: 'typeorm_test',
      synchronize: true,
      logging: true,
      entities: [User],
      poolSize: 10,
      connectorPackage: 'mysql2',
      extra: {
        authPlugin: 'sha256_password',
      },
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

然后在 User 的 Entity 里加一些映射的信息:

typescript 复制代码
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity({
  name: 'nest_user',
})
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    name: 'nest_name',
    length: 50,
  })
  name: string;
}

给映射的表给个名字叫 nest_user,然后有两个数据库列,分别是 id 和 nest_name。

运行:

bash 复制代码
npm run start:dev

在 workbench 看下:

CRUD 操作

然后是增删改查,我们可以注入 EntityManager 来做:

typescript 复制代码
import { Injectable } from '@nestjs/common';
import { InjectEntityManager } from '@nestjs/typeorm';
import { EntityManager } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { User } from './entities/user.entity';

@Injectable()
export class UserService {
  @InjectEntityManager()
  private manager: EntityManager;

  create(createUserDto: CreateUserDto) {
    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) {
    this.manager.save(User, {
      id: id,
      ...updateUserDto,
    });
  }

  remove(id: number) {
    this.manager.delete(User, id);
  }
}

UserController 代码如下:

typescript 复制代码
import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
} from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.userService.create(createUserDto);
  }

  @Get()
  findAll() {
    return this.userService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.userService.findOne(+id);
  }

  @Patch(':id')
  update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
    return this.userService.update(+id, updateUserDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.userService.remove(+id);
  }
}

我们使用 postman 发送 post 请求携带数据测试一下:

再试试查询:

全部查询:

单个查询:

再就是修改:

试试删除:

至此,我们就正式打通了从请求到数据库的整个流程!

使用 Repository 简化数据操作

我们上面是通过 @InjectEntityManager 来注入的 entityManager 对象。

直接用 EntityManager 的缺点是每个 api 都要带上对应的 Entity:

可以先 getRepository(User) 拿到 user 对应的 Repository 对象,再调用这些方法。

若需要使用特定实体的 Repository,可以通过 forFeature 方法将实体注入对应模块,便于进行 CRUD 操作:

它有的方法和 EntityManager 一样,只能用来操作当前 Entity。

还可以注入 DataSource:

不过这个不常用。

这就是 Nest 里集成 TypeOrm 的方式。

相关推荐
Cobyte几秒前
大模型 MCP 本质原理:从协议到代码实现
前端·aigc·ai编程
cong_4 分钟前
狐蒂云🦊跑路我的摸鱼岛没了!
前端·后端·github
kyriewen115 分钟前
我开发的 Chrome 扒图浏览器插件又更新了❗
前端·javascript·chrome·科技·ai
Data_Journal8 分钟前
Puppeteer指纹识别指南:循序渐进,简单易学!
服务器·前端·人工智能·物联网·媒体
月落归舟16 分钟前
深入解析Spring依赖注入 DI 的三种方式
java·后端·spring
geovindu18 分钟前
go:Condition Variable Pattern
开发语言·后端·设计模式·golang·条件变量模式
晓得迷路了19 分钟前
栗子前端技术周刊第 128 期 - Rolldown 1.0、Vitest、Node.js 26.0.0...
前端·javascript·css
金玉满堂@bj21 分钟前
Gin 框架零基础全套入门教程(Go 企业级 Web 开发)
前端·golang·gin
qingy_204622 分钟前
浏览器页面出现竖向滚动条的解决方案
前端·javascript·vue.js
无风听海27 分钟前
UseForwardedHeaders 与 UsePathBase:深入理解 ASP.NET Core 代理感知中间件
后端·中间件·asp.net