返回

在 Nest.js 中使用 Sequelize 进行单表操作

前端

在构建基于 Node.js 的应用程序时,我们常常需要使用关系型数据库来存储和管理数据。Nest.js 是一款出色的 Node.js 框架,它提供了一系列强大的功能来构建 RESTful API 和 Web 应用程序。Sequelize 是一个流行的 ORM(对象关系映射器),它可以帮助我们轻松地将数据库与 Nest.js 应用程序连接起来。

本文将重点介绍如何在 Nest.js 中使用 Sequelize 来进行单表操作,具体来说,我们将以用户表为例,演示如何完成基本的 CRUD(创建、读取、更新、删除)操作。

前期准备

在开始之前,我们需要确保已安装 Nest.js 和 Sequelize。可以通过以下命令安装:

npm install @nestjs/core @nestjs/platform-express sequelize

配置 Sequelize

在 Nest.js 应用程序中配置 Sequelize 的步骤如下:

  1. 创建一个名为 ormconfig.json 的文件,并将其放在项目根目录下。
  2. ormconfig.json 中添加以下内容:
{
  "type": "postgres",
  "host": "localhost",
  "port": 5432,
  "username": "postgres",
  "password": "postgres",
  "database": "nest_sequelize",
  "synchronize": true
}

该配置指定了数据库类型(PostgreSQL)、主机、端口、用户名、密码和数据库名称。synchronize 属性设置为 true,表示每次启动应用程序时都会自动同步数据库模式。

创建用户模型

接下来,我们需要创建一个模型类来表示用户表。在 src/user/user.model.ts 中创建如下文件:

import { Model, Table, Column, DataType } from 'sequelize-typescript';

@Table({
  tableName: 'users',
})
export class User extends Model {
  @Column({
    type: DataType.INTEGER,
    primaryKey: true,
    autoIncrement: true,
  })
  id: number;

  @Column({
    type: DataType.STRING,
    allowNull: false,
    unique: true,
  })
  username: string;

  @Column({
    type: DataType.STRING,
    allowNull: false,
  })
  password: string;
}

该模型类定义了三个属性:id(主键)、username(用户名)和 password(密码)。

创建用户服务

用户服务将包含与用户表进行交互所需的逻辑。在 src/user/user.service.ts 中创建如下文件:

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

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

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

  async findOne(id: number): Promise<User> {
    return this.userModel.findByPk(id);
  }

  async create(user: User): Promise<User> {
    return this.userModel.create(user);
  }

  async update(user: User): Promise<User> {
    return this.userModel.update(user, { where: { id: user.id } });
  }

  async delete(id: number): Promise<void> {
    await this.userModel.destroy({ where: { id: id } });
  }
}

该服务包含了五个方法:

  • findAll:获取所有用户。
  • findOne:根据 ID 获取单个用户。
  • create:创建新用户。
  • update:更新现有用户。
  • delete:根据 ID 删除用户。

创建用户控制器

用户控制器将处理与用户表相关的 HTTP 请求。在 src/user/user.controller.ts 中创建如下文件:

import { Controller, Get, Post, Put, Delete, Param, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.model';

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

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

  @Get(':id')
  async findOne(@Param('id') id: number): Promise<User> {
    return this.userService.findOne(id);
  }

  @Post()
  async create(@Body() user: User): Promise<User> {
    return this.userService.create(user);
  }

  @Put()
  async update(@Body() user: User): Promise<User> {
    return this.userService.update(user);
  }

  @Delete(':id')
  async delete(@Param('id') id: number): Promise<void> {
    return this.userService.delete(id);
  }
}

该控制器包含五个端点:

  • GET /users:获取所有用户。
  • GET /users/:id:根据 ID 获取单个用户。
  • POST /users:创建新用户。
  • PUT /users:更新现有用户。
  • DELETE /users/:id:根据 ID 删除用户。

测试应用程序

完成所有配置和编码后,我们可以通过以下命令启动应用程序:

npm start

然后,我们可以使用 Postman 或类似工具来测试应用程序。

结论

本文演示了如何在 Nest.js 中使用 Sequelize 进行单表操作。我们创建了一个用户模型、用户服务和用户控制器,并完成了基本的 CRUD 操作。这些操作为我们在 Nest.js 应用程序中管理数据库数据提供了基础。

除了本文中介绍的内容,还可以探索 Sequelize 的其他功能,例如关联、事务和查询构建器。通过有效利用 Sequelize 的强大功能,我们可以轻松构建健壮且高效的数据库操作。