手摸手带你搭建博客后台(三)连接数据库完成CRUD

185 阅读2分钟

前言

上一节我们用nestjs搭建了项目,了解了核心模块,接下来我们通过创建用户模块并且完成简单的CRUD。

创建user模块

这里我使用CLI 创建模块的方式。

nest g module user
nest g co user
nest g service user

创建完成后是这样: image.png

连接数据库

我们采用typeorm来完成连接mysql数据库。

  • 安装

    pnpm add @nestjs/typeorm typeorm mysql2

    这里采用的是mysql(自己电脑里面安装一下),vscode安装插件Database Client来连接数据库。 image.png image.png

  • 创建数据库 image.png

  • typeorm连接数据库

    app.module.ts中配置,现在数据库就连接成功了。 image.png

    • 踩坑

      这里我在根目录下添加ormconfig.json配置数据库信息, image.png 然后在app.module.ts中直接配置TypeOrmModule.forRoot()就连接不成功(控制台有报错)。

  • 创建user表

    这里采用代码添加user实体类进行创建表user.entity.ts

    import {
      Entity,
      PrimaryGeneratedColumn,
      Column,
      CreateDateColumn,
      UpdateDateColumn,
      Unique,
    } from 'typeorm';
    
    @Entity('user') // 指定表名为 user
    export class User {
      @PrimaryGeneratedColumn()
      id: number; // 用户id,自增主键
    
      @Column({ unique: true })
      username: string; // 用户名,需要唯一
    
      @Column({ unique: true })
      userCode: string; // 用户code,需要唯一
    
      @Column()
      password: string; // 密码,应该使用加密存储
    
      @Column({ unique: true })
      phone: string; // 手机号,需要唯一
    
      @Column({ unique: true })
      email: string; // 邮箱,需要唯一
    
      @CreateDateColumn({ type: 'timestamp' })
      created_at: Date; // 创建时间
    
      @UpdateDateColumn({ type: 'timestamp' })
      updated_at: Date; // 更新时间
    }
    

    目录结构如下: image.png

    然后在user.module.ts中添加实体类的引入:

    import { Module } from '@nestjs/common';
    import { UserController } from './user.controller';
    import { UserService } from './user.service';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { User } from './entities/user.entity';
    
    @Module({
      imports: [TypeOrmModule.forFeature([User])],
      controllers: [UserController],
      providers: [UserService],
    })
    export class UserModule {}
    

    然后刷新数据库表,就看到新增了user表: image.png

CRUD

  • 插入用户

    • 手动添加create-user.dto.ts: image.png

    • user.service.ts

    import { Injectable } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { Repository } from 'typeorm';
    import { User as UserEntity } from './entities/user.entity';
    import { CreateUserDto } from './dto/create-user.dto';
    
    @Injectable()
    export class UserService {
      // 通过@InjectRepository(UserEntity)将UserEntity的仓库注入到userRepository属性中,这样就可以在类中使用userRepository来操作数据库
      constructor(
        @InjectRepository(UserEntity)
        private readonly userRepository: Repository<UserEntity>,
      ) {}
    
      // 这里添加创建user的方法;createUserDto:方法的参数,是一个CreateUserDto类型的对象,包含了创建用户所需的数据
      async create(createUserDto: CreateUserDto) {
        // 使用userRepository的save方法将createUserDto保存到数据库中,并返回保存后的用户对象。
        return await this.userRepository.save(createUserDto);
      }
    }
    
  • user.controller.ts

    import { Controller, Body, Post } from '@nestjs/common';
    import { UserService } from './user.service';
    import { CreateUserDto } from './dto/create-user.dto';
    
    @Controller('user')
    export class UserController {
     // 注入UserService实例,用于在控制器中调用用户服务的方法。
     constructor(private readonly userService: UserService) {}
    
     //   定义一个异步方法createUser,接收一个CreateUserDto类型的参数。@Body()装饰器用于从请求体中提取数据
     @Post('create')
     async createUser(@Body() createUserDto: CreateUserDto) {
       // 调用UserService的create方法,传入createUserDto参数,并返回结果。
       return this.userService.create(createUserDto);
     }
    }
    

然后通过工具请求,创建成功: image.png image.png

当然个人还是喜欢用数据库工具查看,大家根据自己的喜好: image.png

  • 查询

    • user.controller.ts
      image.png

    • user.service.ts image.png

image.png

  • 修改

    • update-user.dto.ts
    import { PartialType } from '@nestjs/mapped-types';
    import { CreateUserDto } from './create-user.dto';
    
    export class UpdateUserDto extends PartialType(CreateUserDto) {}
    
    • user.controller.ts
      image.png
    • user.service.ts
      image.png

image.png

  • 删除
    • user.controller.ts image.png
    • user.service.ts
      image.png

image.png