NestJS链接MySQL数据库实现CRUD接口

前言

本文通过NestJS框架链接MySQL数据库实现增、删、改、查接口的实现;

工具

  • 服务端框架:NestJS
  • 数据库:MySQL
  • VSCODE插件:Database Clien 管理数据库
  • 浏览器插件:apifox 验证接口

构建项目

shell 复制代码
# 全局安装nest脚手架
$ npm i -g @nestjs/cli 
$ nest new project-name//例如(api)项目名 
# 启动项目 
$ npm run start:dev//开发阶段使用
# 下载相关的包(用于链接MySQL数据库使用)
$ npm install --save @nestjs/typeorm typeorm mysql2

文件目录如下:

arduino 复制代码
src:.
    ├─crud(说明:单个接口目录名为crud)//通过指令创建出来的 例如:npx nest g res crud --no-spec
    |  |--- dto//目录
    |  |   |---create-crud.dto.ts
    |  |   |_update-crud.dto.ts
    |  |--- entities
    |  |   |__crud.entity.ts//定义数据表字段的类型
    |  |--- crud.controller.ts//关于此接口控制器
    |  |--- crud.module.ts//关于此接口模块
    |  |_ crud.service.ts//关于此接口服务      
    ├─ app.controller.ts//控制器
    ├─ app.module.ts//模块
    ├─ app.service.ts//服务
    └─ main.ts//入口文件

链接数据库

先创建一个数据库:可以参考博主的另一篇文章《快速安装MySQL及常用SQL基操》

sql 复制代码
前提已经安装了mysql并且配置完成;
# 创建数据库步骤
1.搜索框输入cmd使用快捷键(Ctrl+Shift+Enter)以管理员身份运行
2.输入 mysql -u root -p //安装回车键 输入数据库密码 进入mysql;
3.创建新的数据 create database 数据库名//(nestapi)
3.可以通过show databases;//验证是否创建成功;如果创建成功
4.切换到创建的数据中:use 数据库名//例如(nestapi)
5.创建表以及导入数据:
# 创建表: CREATE TABLE 表名 ( 列名1 数据类型 约束, 列名2 数据类型 约束, ... );
# 例子
CREATE TABLE cruds ( 
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        email VARCHAR(100) NOT NULL UNIQUE,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
      );
# 插入完整行:INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...);
# 例子
INSERT INTO cruds (name,email) VALUES 
('Bob','[email protected]' ),
('Charlie', '[email protected]'),
('Yuli', '[email protected]');
### 以上操作也可以借助Database Clien插件实现在编辑器中安装对应的插件连链接数据库建表、导入数据

在app.module.ts

typescript 复制代码
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CrudModule } from './crud/crud.module';
// import {ConfigModule} from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
// import { CrudEntity } from './crud/entities/crud.entity';
@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql', // 数据库类型
      host: 'localhost', // 数据库主机地址
      port: 3306, // 数据库端口
      username: 'root', // 数据库用户名
      password: '123456', // 数据库密码 如 123456
      database: 'nestapi', // 数据库名称 如nestapi
      entities: [], // 实体类路径 导入实体路径__dirname + '/**/*.entity{.ts,.js}'
      synchronize: true, // 自动同步数据库结构(生产环境建议关闭)
      logging: true, // 是否记录日志
    })
    ],//导入CrudModule接口模块
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
# 执行 npm run start:dev 启动成功说明数据库链接成功

接口编写及调试

使用指令创建一个CRUD模块

perl 复制代码
# 创建一个CURD并且不生成测试文件(常用)
npx nest g res xxxx --no-spec

目录生成

less 复制代码
src:.
    ├─crud(说明:单个接口目录名为crud)//通过指令创建出来的 例如:npx nest g res crud --no-spec
    |  |--- dto//目录
    |  |   |---create-crud.dto.ts
    |  |   |_update-crud.dto.ts
    |  |--- entities
    |  |   |__crud.entity.ts//定义数据表字段的类型
    |  |--- crud.controller.ts//关于此接口控制器
    |  |--- crud.module.ts//关于此接口模块
    |  |_ crud.service.ts//关于此接口服务

在entities/crud.entity.ts定义数据表字段类型

less 复制代码
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity('crud')//数据表
export class CrudEntity {
  @PrimaryGeneratedColumn() // 标记为主列,值自动生成 id
  id: number;

  @Column({ length: 50 })//定义名字
  name: string;

  @Column({ length: 50 })//定义邮箱
  email: string;

  @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })//创建时间
  create_at: Date;
}

在crud.service.ts

typescript 复制代码
import { HttpException,Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CrudEntity } from '../crud/entities/crud.entity';
import { CreateCrudDto } from './dto/create-crud.dto';
import { UpdateCrudDto } from './dto/update-crud.dto';
@Injectable()
export class CrudService {
  constructor(
    @InjectRepository(CrudEntity)
    private readonly crudRepository: Repository<CrudEntity>, 
  ){}
  //新建
  async create(createCrudDto: CreateCrudDto) {
    let data=await this.crudRepository.save(createCrudDto);
    if(!data){
      throw new HttpException({
        code: 1000,
        message: '数据不存在',
      }, 201);
    }
    return {
      code:200,
      message:'成功', 
    }
  }
   //查看全部数据
  async findAll() {
    let data=await this.crudRepository.find();
    if(!data){
      throw new HttpException({
        code: 1000,
        message: '数据不存在',
      }, 201);
    }
    return {
      code:200,
      message:'成功',
      data};
    // return `This action returns all crud`;
  }
//根据id查看数据
  async findOne(id: number) {
    let data=await this.crudRepository.findOne({
      where:{
        id:id
      }
    })
    return {
      code:200,
      message:'成功',
      data
    }
  }
//更新数据
 async update(id: number, updateCrudDto: UpdateCrudDto) {
    console.log(id)
    console.log(updateCrudDto)
   let data= await this.crudRepository.update(id,updateCrudDto)
    console.log(data)
    if(!data){
      throw new HttpException({
        code: 1000,
        message: '数据不存在',
      }, 201); 
    }
    return {
      code:200,
      message:'更新成功', 
    }
    // return `This action updates a #${id} crud`;
  }
//删除数据
  async remove(id: number) {
 let data=await this.crudRepository.delete(id)
    console.log(data)
    return {
      code:200,
      message:'删除成功',
    };
  }
}

在crud.controller.ts

less 复制代码
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { CrudService } from './crud.service';
import { CreateCrudDto } from './dto/create-crud.dto';
import { UpdateCrudDto } from './dto/update-crud.dto';

@Controller('crud')//表名
export class CrudController {
  constructor(private readonly crudService: CrudService) {}

  @Post('')//新建
  create(@Body() createCrudDto: CreateCrudDto) {
    return this.crudService.create(createCrudDto);
  }

  @Get()//查看全部数据
  findAll() {
    return this.crudService.findAll();
  }

  @Get(':id')//通过id查看叔叔
  findOne(@Param('id') id: string) {
    return this.crudService.findOne(+id);
  }

  @Patch(':id')//更新数据
  update(@Param('id') id: string, @Body() updateCrudDto: UpdateCrudDto) {
    return this.crudService.update(+id, updateCrudDto);
  }

  @Delete(':id')//删除数据
  remove(@Param('id') id: string) {
    return this.crudService.remove(+id);
  }
}

在crud.module.ts

python 复制代码
import { Module } from '@nestjs/common';
import { CrudService } from './crud.service';
import { CrudController } from './crud.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CrudEntity } from '../crud/entities/crud.entity';//表字段定义
@Module({
  imports: [TypeOrmModule.forFeature([CrudEntity])],
  controllers: [CrudController],
  providers: [CrudService],
})
export class CrudModule {}

在app.module.ts配置

go 复制代码
imports: [ 
TypeOrmModule.forRoot({ 
type: 'mysql', // 数据库类型 
host: 'localhost', // 数据库主机地址 
port: 3306, // 数据库端口 
username: 'root', // 数据库用户名 
password: '123456', // 数据库密码 如 123456 
database: 'nestapi', // 数据库名称 如nestapi
entities: [__dirname + '/**/*.entity{.ts,.js}'], // 实体类路径 导入实体路径
synchronize: true, // 自动同步数据库结构(生产环境建议关闭)
logging: true, // 是否记录日志
}),
CrudModule
],//导入接口模块

接口实现完后通过Apifox浏览器插件

  • 创建团队
  • 在团队中创建项目
  • 进入项目点击快捷请求 如图所示

总结

以上就是NestJS链接MySQL以及编写、调试、测试增、删、改、查接口的全部流程,以及Database Clien的基本操作等相关内容;

相关推荐
Full Stack Developme1 小时前
SQL 版本历史
数据库·sql
杰克逊的日记4 小时前
mysql数据实时全量+增量迁移
数据库·mysql·数据迁移
linuxxx1104 小时前
centos7 升级MariaDB 到 10.5 或更高版本
数据库·mariadb
换个网名有点难5 小时前
django怎么配置404和500
数据库·django
Adellle5 小时前
MySQL
数据库·后端·mysql
就是有点傻6 小时前
C# 中实现一个线程持续读取,另一个线程负责写入,且写入时读取线程暂停
数据库·c#
云观秋毫6 小时前
试试智能体工作流,自动化搞定运维故障排查
运维·数据库·自动化
是沫沫子耶6 小时前
mysql实例
数据库
比钻石还闪亮的nan人6 小时前
CentOS 7下安装PostgreSQL 15
数据库·postgresql
Full Stack Developme6 小时前
SQL 集合运算
数据库·sql