likes
comments
collection
share

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

作者站长头像
站长
· 阅读数 10

最近在学习神光大神的《Nest通关秘籍》,接下来的日子里,我将更新一系列的学习笔记。

感兴趣的可以关注我的专栏《Nest 通关秘籍》学习总结

特别申明:本系列文章已经经过作者本人的允许。 大家也不要想着白嫖,此笔记只是个人学习记录,不是非常完善,如想深入学习可以去购买原版小册,购买链接点击《传送门》。

本章我们来学习一下如何在Nest中集成TypeORM。

创建nest项目

nest new nest-typeorm -p pnpm

创建一个 crud 的模块:

nest g resource user

引入 typeorm:

npm install --save @nestjs/typeorm typeorm mysql2

在入口引入数据配置:

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

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

注意提前创建typeorm_test数据库。

在 User 的 Entity 里添加映射信息:

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

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

  @Column({
    comment: '姓名',
    length: 50,
  })
  name: string;
}

运行项目:

npm run start:watch

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

可以看到建表语句。在数据库中也生成了user表和插入了对应的字段:

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

接下来我们做一些增删改查的操作。

首先在user表中,我们手动插入一条数据:

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

注入 EntityManager,实现增删改查的操作:

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);
  }
}

打开apifox,来测试一下。

1.查询接口

输入:http://localhost:3000/user

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

返回结果为数组。

输入:http://localhost:3000/user/1

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

返回结果为单个对象。

2.新增接口

输入:http://localhost:3000/user

方法POST,参数为Body形式,输入name

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

数据库插入了一条数据:

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

3.修改接口

输入:http://localhost:3000/user/3

方法为PATCH,参数为Body形式,输入name

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

数据库中的数据发生了改变:

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

4.删除接口

输入:http://localhost:3000/user/3

方法为DELETE

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

id=3的一条数据被删除了。

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

现在我们直接用 EntityManager 的缺点是每个 api 都要带上对应的 Entity

神光《Nest 通关秘籍》学习总结-如何在Nest中集成TypeORM

Nest 做了封装,在 user 模块可以引入 TypeOrmModule.forFeature 对应的动态模块,传入 User 的 Entity

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

然后在模块里注入 Repository :

import { Injectable } from '@nestjs/common';
import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
import { EntityManager, Repository } 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;

  @InjectRepository(User)
  private userRepository: Repository<User>;

  create(createUserDto: CreateUserDto) {
    this.userRepository.save(createUserDto);
    // this.manager.save(User, createUserDto);
  }
	// ...
}

基于以上,我们就在nest中实现了一个基本的CRUD操作,并且和mysql进行了连接。你可以在此基础上做更复杂的业务,甚至做前后端联调。