felix-cao / Blog

A little progress a day makes you a big success!
29 stars 4 forks source link

002 NestJS - 插入一条用户数据 #228

Open felix-cao opened 4 days ago

felix-cao commented 4 days ago

需要集成 MySqlTypeORM 我们的数据库里有一张user表,包含的字段:idname(名字),age(年龄)sql如下:

CREATE TABLE IF NOT EXISTS user (
    `id` VARCHAR(36) PRIMARY KEY,
    `username` VARCHAR(255) NOT NULL,
    `email` VARCHAR(255) DEFAULT NULL,
    `mobile` VARCHAR(11) DEFAULT NULL,
    `password` VARCHAR(255) NOT NULL,
    `role` INT(2) NOT NULL,
    `is_active` TINYINT(1) DEFAULT 1,
    `created_at` DATETIME DEFAULT NULL,
    `updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
);

不执行上面的 SQL 语句, 创建 user.entity.ts 实体类, 在 npm start 后,TypeORM 会自动创建 user 表.

一、 安装 TypeORM, Mysql 依赖

$ npm install --save @nestjs/typeorm typeorm @types/bcryptjs mysql2 bcryptjs

二、创建 user module

$ nest g mo user
$ nest g co user --no-spec
$ nest g s user --no-spec

2.1 创建User实体类

src/user 目录下创建 user 实体类 user.entity.ts

// src/user/user.entity.ts

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

@Entity()
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ unique: true })
  username: string;

  @Column({ select: false })
  password: string;

  @Column()
  role: number;

  @Column('bool')
  is_active: boolean;

  @CreateDateColumn()
  created_at: Date;

  @UpdateDateColumn()
  updated_at: Date;
}

2.2 创建 user.service.ts

创建查询,添加user的方法

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

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

  create(user: User): Promise<User> {
    return this.usersRepository.save(user);
  }

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

2.3 创建 user.controller.ts

user.controller.ts 添加对应 api 请求接口:

// src/user/user.controller.ts

import * as bcrypt from 'bcryptjs';
import { User } from './user.entity';
import { UserService } from './user.service';
import { Body, Controller, Get, Post } from '@nestjs/common';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  create(@Body() user: User): Promise<User> {
    const salt = bcrypt.genSaltSync();
    console.log('\r\n-----------', salt);
    user.password = bcrypt.hashSync(user.password);
    return this.userService.create(user);
  }

  @Get()
  findAll(): Promise<User[]> {
    return this.userService.findAll();
  }
}

上面的代码使用 bcryptpassword 进行 hash 加密后入库。

2.4 在 module 中加入实体类映射

user.module.ts 中引入 TypeORMuser.entity.ts 实体类映射 MySQL user

// src/user/user.module.ts

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { User } from './user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

三、配置 MySQL connect

在项目 src/app.module.tsroot module)中通过@nestjs/typeorm来链接 MySQL

import { Module } from '@nestjs/common';
import { AuthModule } from './auth/auth.module';
import { TasksModule } from './tasks/tasks.module';
import { UserModule } from './user/user.module';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'zenbly',
      password: 'my-secret-local-db-password',
      database: 'wetodo',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    AuthModule,
    TasksModule,
    UserModule,
  ],
})
export class AppModule {}

现在可以去测试一把接口了。