最近在学习神光大神的《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进行了连接。你能够在此基础上做更复杂的业务,甚至做前后端联调。