Nestjs使用sequelize完成单表操作

2,151 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

本文主要介绍nestjs中使用sequelize完成用户表的操作

首先下载相关的包

$ npm install --save @nestjs/sequelize sequelize sequelize-typescript mysql2
$ npm install --save-dev @types/sequelize

SequelizeModule导入到根AppModule中

// app.module
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
import { SequelizeModule } from '@nestjs/sequelize';
import { User } from './users/user.model'; // 定义的User模型,后面我们定义
@Module({
  imports: [
    SequelizeModule.forRoot({
      dialect: 'mysql', // 数据库类型,sequelize支持  Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 且对数据库版本有要求。可移步官网查看
      host: '127.0.0.1', // 主机ip
      port: 3306, // 数据库端口 mysql默认在3306端口
      username: 'xxx', // 数据库用户名
      password: 'xxx', // 数据库密码
      database: 'xxx', // 具体数据库
      models: [User], // 要开始使用`User`模型,我们需要通过将其插入到`forRoot()`方法选项的`models`数组中来让`Sequelize`知道它的存在。
    }),
    UsersModule,
  ],
})
export class AppModule {}

定义User模型

// users/user.model
import { Column, Table, Model } from 'sequelize-typescript';
@Table({
  tableName: 'admin_user', // 指定表名。默认会使用模型名(User)生成sql。
  timestamps: false, // 默认true。true时会带createdAt、updatedAt字段查表
})
export class User extends Model<User> {
  @Column
  username: string;
  @Column
  password: string;
  @Column
  email: string;
  @Column
  mobile: string;
  @Column
  create_time: Date;
}

完成上述操作后需要在user.mudule注入才可以在user.serveice中使用User模型

// users/user.module
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { SequelizeModule } from '@nestjs/sequelize';
import { User } from './user.model';
@Module({
  controllers: [UsersController],
  providers: [UsersService],
  imports: [SequelizeModule.forFeature([User])], // 确保service用@InjectRepository()装饰器将 UsersRepository 注入到 UsersService 中:
})
export class UsersModule {}

注入完后,就可以在构造函数中给UserService挂上User模型。便于后续的数据库操作(例子中只给出【查】操作。单表的增、删、改等都大同小异。可到sequelize官网学习相关操作)

// users/user.service
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/sequelize';
import { User } from './user.model';

@Injectable()
export class UsersService {
  constructor( 
    @InjectModel(User)
    private userModel: typeof User,
  ) {}

  findAll(): Promise<User[]> {
    return this.userModel.findAll(); // 使用userModel查全部数据
  }

  find(id: string): Promise<User> {
    return this.userModel.findOne({ where: { id } }); // 使用userModel限制条件查选
  }
}

最后看一下controller部分的代码。走通整个过程

// users/user.controller
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './user.model';

@Controller('users')
export class UsersController {
  constructor(private usersService: UsersService) {}
  @Get('users')
  async findAll(): Promise<User[]> {
    const r = await this.usersService.findAll();
    console.log(r);
    return r;
  }
  @Get(':id')
  async findOne(@Param() params): Promise<User> {
    const { id } = params;
    return await this.usersService.find(id);
  }
}

Postman请求测试

image.png

Sequelize 5.x中文文档
Nestjs 8.x中文文档