nest.js连接mysql数据库

535 阅读2分钟

Typeorm一个orm框架实现js对象与数据库表映射

1.使用nest.js连接数据库之前先简单的介绍一下Typerom这个插件,可以让我们写js对象的形式定义数据库表。

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

@Entity()
export class UserLoginInfo {
  @PrimaryGeneratedColumn() // 这是主键id  需要PrimaryGeneratedColumn这个修饰器去定义
  id: number;

  @Column() // Column代表的行列修饰器  每一列的属性
  phone: number;

  @Column()
  password: string;
  
}

Typeorm会根据这个Entity这个修饰器来进行和数据库表的映射,会根据这个类名来进行声明数据库表,会将小驼峰转化成-的形式命名。这样我们就可以是实现对数据库表的增删改操作 2. nest.js提供了Controller、Service、Module等划分,MVC的模式的实现,controller层实现数据请求的处理,将处理过的数据参数传递给Service层,Service实现业务逻辑的实现及数据库表的增删改。根据Module来进行模块划分。 3. 从Module文件来开始结合Typeor来进行数据库连接 依赖包

npm install @nestjs/typeorm typeorm mysql2
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersModule } from './users/users.module';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: '123456',
      database: 'test', // 数据库名
      autoLoadEntities: true, // 自动加载entity文件
      synchronize: true, //根据实体自动创建数据库表
    }),
    UsersModule,
  ],
})
export class AppModule {}

在主module文件中配置好了后再去创建我们的user模块

@@files user.entity.ts  数据库表声明文件
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

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

  @Column()
  phone: number;

  @Column()
  password: string;
  
}

@@files users.controller.ts  Controller层文件声明路由
import { Bind, Body, Controller, Delete, Get, HttpStatus, Param, Post, Res } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UserInfo } from "./userInfo.entity";
import { UsersService } from './users.service';
import { Response } from 'express';
@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post('register')
  async register(@Res() res:Response, @Body() createUserDto:CreateUserDto): Promise<Response> {
    const userInfo = await this.usersService.create(createUserDto);
    let responseObj = {
        code: 1,
        message: "Ok",
        HttpStatus: HttpStatus.OK
    };
    if (!userInfo) {
        responseObj.code = 0;
        responseObj.message = "该手机号已经注册过了"
        responseObj.HttpStatus = HttpStatus.INTERNAL_SERVER_ERROR
    }
    return res.status(responseObj.HttpStatus).json({
        code: responseObj.code,
        data: [],
        message: responseObj.message
    });
  }
  @Post('login')
  login(@Body() createUserDto: CreateUserDto): Promise<UserInfo[]> {
    return this.usersService.login(createUserDto);
  }
  
}

@@files users.service.ts 声明service层文件对业务层逻辑处理
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { UserLoginInfo } from './user.entity';
import { UserInfo } from "./userInfo.entity";

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(UserLoginInfo)
    private readonly usersRepository: Repository<UserLoginInfo>,
    @InjectRepository(UserInfo)
    private readonly usersInfoRepository: Repository<UserInfo>,
  ) {}

  async create(createUserDto: CreateUserDto): Promise<Boolean> {
    const user = new UserLoginInfo();
    user.phone = createUserDto.phone;
    let hasPhone = await this.findPhoneHandler(user.phone);
    if (hasPhone) {
        return false;
    }
    user.password = (createUserDto.phone + '').slice(-6);
    let loginInfo
    try {
        loginInfo = await this.usersRepository.save(user)
    } catch (error) {
        throw new Error(error);
    }
    return loginInfo;
  }

  async findPhoneHandler (phone: number): Promise<Boolean> {
    let hasPhone = await this.usersRepository.find({
        where: {
            phone: phone
        }
    })
    if (hasPhone && hasPhone.length > 0) {
        return false
    }
    return true
  }

  async login(query: CreateUserDto): Promise<UserInfo[]> {
    const loginInfo = this.usersRepository.find({
        where: {
            phone: +query.phone
        }
    });
    const userInfo = this.getUserInfo({phone: loginInfo[0].phone})
    return userInfo;
  }

  async getUserInfo(param: {
      phone: string
  }): Promise<UserInfo[]> {
    return this.usersInfoRepository.find({
        where: {
            phone: param.phone
        }
    });
  }
  
}

@@files users.module.ts  声明module层引入依赖模块及数据库表注册
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserLoginInfo } from './user.entity';
import { UserInfo } from './userInfo.entity';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

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

@@ files create-user.dto.ts 创建dto文件
export class CreateUserDto {
    phone: number;
    code: SVGStringList;
    password?: string;
  }

这样我们nets.js就连接好了数据库。

gitee代码链接gitee.com/xuxuqingson…