likes
comments
collection
share

Nestjs入门,使用TypeORM连接MySQL

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

前言

从上一篇文章中,已经搭建了nest-admin的项目基础,也添加了users模块的增删改查接口。

我们需要对接数据库,新建users表,并修改users.service.ts的代码进行数据库的交互,还需要使用swagger ui生成api文章

首先需要安装数据库

安装MySQL并使用TypeORM连接

使用Docker下载MySQL镜像及创建MySQL容器

2022年了,再去一步步安装MySQL的话,我自问没信心一次性安装顺利,还是使用docker一步到位吧

首先安装docker,这里不详细描述了,建议到官网下载,还可以下载docker desktop管理本地镜像和容器

安装docker之后,打开终端输入

docker -v
Docker version 20.10.17, build 100c701

可以看到docker安装成功,接着就可以安装MySQL镜像了

安装镜像之前,我们打开dockerHub,寻找我们需要的MySQL镜像

点击搜索dockerHub中的MySQL镜像

我们可以选择MySQL8镜像,点击复制命令

Nestjs入门,使用TypeORM连接MySQL

在终端输入docker pull mysql:8.0

安装完成之后,输入docker images,可以看到我们所有的镜像,当然也包括刚刚下载的MySQL镜像

docker images

REPOSITORY               TAG             IMAGE ID       CREATED        SIZE
mysql                    8.0             4ddc4f9f1152   5 days ago     491MB
nginx                    1.23.1-alpine   78eae2423184   6 weeks ago    22.1MB
mongo                    latest          8545a6005ade   4 months ago   665MB

使用命令新建MySQL容器,可以修改命令中的数据库root密码MYSQL_ROOT_PASSWORD

sudo docker run --name=mysqldatabase -itd -p 0.0.0.0:3306:3306  -e MYSQL_ROOT_PASSWORD=123456  mysql:8

docker ps

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
08e0921058d8   mysql:8   "docker-entrypoint.s…"   19 seconds ago   Up 19 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp   mysqldatabase

可以看到已经成功新建MySQL容器了,打开NaviCat数据库管理工具链接MySQL

使用刚刚命令中的数据库密码链接数据库

Nestjs入门,使用TypeORM连接MySQL

到这里已经完成了数据库的安装

使用TypeORMmysql2

安装TypeORMmysql2

pnpm install --save @nestjs/typeorm typeorm mysql2

module.ts文件中添加@nestjs/typeorm配置

app.module.ts添加配置代码,使用@nestjs/typeorm连接MySQL

需要注意的是autoLoadEntitiessynchronize都为true的情况下,实体类才会同步到数据表

import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: '123456',
      database: 'sys',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      autoLoadEntities: true, // 自动链接被 forFeature 注册的实体
      synchronize: true, // 实体与表同步 调试模式下开始。不然会有强替换导致数据丢是
    }),
    UsersModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

随后修改user.module.ts,添加@nestjs/typeorm的配置,代码如下

需要注意的是,TypeOrmModule.forFeature接收的参数是数据

import { User } from './entities/user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UsersController],
  providers: [UsersService]
})
export class UsersModule {}

创建User的实体类

上一篇文章中,创建了curd模块之后,其中也包括user.entity.ts

什么是entity,可以参考What is Entity? | TypeORM

按我的理解,就是描述数据库表字段的代码文件

User的字段如下,有id,昵称nickName,姓名userName,电话号码phoneNumber,还有密码password

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

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

  @Column()
  nickName: string;

  @Column()
  userName: string;

  @Column()
  phoneNumber: string;

  @Column()
  password: string;

  @Column({ default: true })
  isActive: boolean;

  @Column('time')
  createtime: string;

  @Column('time')
  updatetime: string;
}

重启项目后,打开Navicat,可以看到已经在sys库中新建了user表了

Nestjs入门,使用TypeORM连接MySQL

接口代码修改

成功连上了数据库,也新建了user表,接下来就是修改接口的代码,访问数据库的数据

首先编辑create-user.dto.ts文件

export class CreateUserDto {
  nickName: string;

  userName: string;

  phoneNumber: string;

  password: string;

  isActive: boolean;

  createtime: string;

  updatetime?: string;
}

还有update-user.dto.ts,修改可以使用PartialType函数,可以直接继承CreateUserDto

import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';

export class UpdateUserDto extends PartialType(CreateUserDto) {}
补充DTO的解释

什么是DTO呢?data transfer object数据传输对象,简称DTODTO帮助我们定义系统内的接口或输入和输出。

查询接口

补充以下代码,使用typeorm的方法查询数据库user表中的数据

InjectRepository方法需要传入User实体类

Repository也接收User实体类

...
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm的';
import { User } from './entities/user.entity';

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

  async findAll() {
    return await this.userRepository.find();
  }
  
...
}

访问localhost:3003/users,可以看到接口已经返回了表的数据

Nestjs入门,使用TypeORM连接MySQL

新增修改接口service层代码

需要安装dayjs,用于录入创建时间createtime

async create(createUserDto: CreateUserDto) {
    const createtime = dayjs().format('YYYY-MM-DD HH:mm:ss');
    createUserDto.createtime = createtime;
    const user = await this.userRepository.save(createUserDto);
    return this.userRepository.save(user);
}

async update(id: number, updateUserDto: UpdateUserDto) {
    const updatetime = dayjs().format('YYYY-MM-DD HH:mm:ss');
    updateUserDto.updatetime = updatetime;
    const user = await this.userRepository.preload({
      id: id,
      ...updateUserDto
    });
    if (!user) {
      throw new Error(`未找到该用户数据`);
    }
    return this.userRepository.save(user);
}

详情和删除接口service层代码

需要注意的是TypeORM升级到0.3.x后,需要改用findOneBy函数

async findOne(id: number) {
    const user = await this.userRepository.findOneBy({
      id: id,
    });
    return user
}

async remove(id: number) {
    const user = await this.findOne(id)
    if (!user) {
      throw new Error(`未找到该用户数据`);
    }
    return this.userRepository.remove(user)
}

结语

写得不对的地方,欢迎各位点出,十分感谢

项目地址

nest-admin: 基于nestjs开发的管理系统后端项目代码 (gitee.com)

文章推荐

转载自:https://juejin.cn/post/7140081041041489934
评论
请登录