前言
本文通过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的基本操作等相关内容;