Nestjs系列一:实现数据库的新增和查询功能

267 阅读3分钟

NESTJS.png 最近在学习nestjs相关的知识,在实现的过程中遇到了一些问题,此系列用于记录解决问题的过程,希望可以帮助到有同样困惑的朋友们。由于作者也是刚接触框架,所以暂时不会涉及到原理方面的内容,主要以实现功能为主。

作为此系列的第一篇文章,将实现对于mysql数据库用户表的新增和查询功能。除了nestjs框架,我们会使用到typeorm,这是一个ORM(Object-relation mapping)框架,简单来讲,就是通过实例对象的方法,来操作数据库。

以下是涉及到的几个主要npm库的版本:

  • @nestjs/common 10.0.0
  • @nestjs/core 10.0.0
  • @nestjs/typeorm 10.0.2
  • typeorm 0.3.20
  • mysql2 3.11.0

一、创建项目

使用nestjs官方提供的脚手架创建项目。

# 全局安装@nestjs/cli库
npm i -g @nestjs/cli
# 创建项目
nest new <project-name>
# 或者创建ts项目
nest new <project-name> --strict
# 进入项目目录
cd <project-name>
# 启动项目
npm run start:dev

创建项目.png

注意:nestjs默认的端口号是3000,端口被占用的话,可以在main.ts文件中修改端口号。

二、配置数据库

首先需要创建一个项目的数据库,创建用户表,

-- 创建数据库plant_guide
-- 创建用户表
CREATE TABLE IF NOT EXISTS `plant_user` 
(
	`id` INT AUTO_INCREMENT PRIMARY KEY COMMENT "用户id",
    `name` VARCHAR(50) NOT NULL COMMENT "用户名称",
    `is_active` BOOLEAN NOT NULL DEFAULT true COMMENT "用户状态"
);

-- 插入用户数据
INSERT INTO plant_user(name) VALUES("欧阳锋");
INSERT INTO plant_user(name) VALUES("杨过");
INSERT INTO plant_user(name) VALUES("小龙女");
INSERT INTO plant_user(name) VALUES("一休");

接着,项目中配置数据库的信息,

// app.module.ts
import { Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: '********', // 自己配置的数据访问密码
      database: 'plant_guide',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true, // 在生产环境不要用true
      autoLoadEntities: true
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {}

三、实现用户表的CRUD

在src文件夹下创建user文件夹,用来编写用户功能的接口内容。

src
│
└─user
    │  user-http.module.ts
    │  user.controller.ts
    │  user.entity.ts
    │  user.module.ts
    │  user.service.ts
    │
    ├─dto
    │      create-user.dto.ts
    │
    └─interfaces
            user.interface.ts

3.1 Entity

创建用户实例,字段和表字段一一对应。

// user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity('plant_user') // 注意此处要和数据库表的名字保持一致,否则typeorm会创建新的表
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

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

3.2 Controller

创建Controller层,用于处理请求,响应内容。

// user.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';

@Controller('user')
export class UserController {
  constructor(private userService: UserService) {}
  @Get()
  async findAll() {
    return await this.userService.findAll();
  }

  @Post()
  async create(@Body() user: CreateUserDto) {
    return await this.userService.create(user);
  }
}

3.3 Service

创建Service层,主要用于处理业务逻辑。

// user.service.ts
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { User } from './user.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

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

  async findAll(): Promise<User[]> {
    return await this.userRepository.find();
  }

  async create(dto: CreateUserDto) {
    const { name } = dto;
    const user = await this.userRepository.findOneBy({
      name: name
    })
    if (user) {
      return {
        code: 200,
        msg: '已添加'
      }
    } else {
      await this.userRepository
        .createQueryBuilder()
        .insert()
        .values([
          {name: name}
        ])
        .execute()
      return {
        code: 200,
        msg: '添加成功'
      }
    }
  }
}

3.4 Dto

// create-user.dto.ts
export class CreateUserDto {
  name: string;
}

3.5 Module

// user.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  exports: [TypeOrmModule]
})
export class UserModule {}
// user-http.module.ts
import { Module } from '@nestjs/common';
import { UserModule } from './user.module'
import { UserService } from './user.service';
import { UserController } from './user.controller';

@Module({
  imports: [UserModule],
  providers: [UserService],
  controllers: [UserController]
})

export class UserHttpModule {}

四、导入服务

// app.module.ts
// ...
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserHttpModule } from './service/user/user-http.module';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      //...
    }),
    UserHttpModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {}

以上就实现了对于用户表的新增和查询功能,修改和删除的功能同理。