nestjs+typeorm+mysql基本使用学习

初始化项目

安装依赖

npm i -g @nest/cli

新建项目

nest new project-name

命令行创建

创建Controller:nest g co test

创建Module:nest g mo test

创建Service:nest g service test

请求创建

123123

接口文档swagger

安装依赖

npm install @nestjs/swagger swagger-ui-express

装饰器

Controller装饰器:@ApiTags("Controller标签")

Controller装饰器:@ApiBearerAuth(),用于token鉴权,在文档页设置token

Api装饰器:@ApiOperation({ summary: 'Api摘要', description: 'Api描述' })

模型字段装饰器:@ApiProperty({ description: '字段描述' }),字段必填

模型字段装饰器:@ApiPropertyOptional({ description: '字段描述' }),字段非必填

注册使用

typescript 复制代码
// main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import {
  DocumentBuilder,
  SwaggerDocumentOptions,
  SwaggerModule,
} from '@nestjs/swagger';

const app = await NestFactory.create(AppModule, { cors: true });

const swaggerOption = new DocumentBuilder()
    .setTitle('接口文档') // 文档标题
    .setDescription('用来展示API信息') // 文档描述
    .setVersion('1.0') // 文档版本号
    .addTag('') // 标签
    .addBearerAuth() // token鉴权
    .build();
    
const document = SwaggerModule.createDocument(app, swaggerOption);
// 第一个参数是文档访问路径前缀
SwaggerModule.setup('doc', app, document);

await app.listen(3000);
// 访问文档路径:http://localhost:3000/doc

管道(验证)

安装依赖

npm install class-validator class-transformer

装饰器

模型字段装饰器:@IsNotEmpty({ message: "xxx字段为必填项" })

常用方法

typescript 复制代码
import { isBoolean, isNumber, isArray, validate} from 'class-validator';
import { plainToClass } from 'class-transformer';
// isBoolean 是否为布尔值
// isNumber 是否为数字
// isArray 是否为数组
// validate 验证配置的验证规则
// plainToClass 将对象转换为Class,用以获取验证规则进行验证

注册使用

管道使用需要注册:

在main.ts中全局注册管道:

typescript 复制代码
// main.ts
import { ValidationPipe } from '@nestjs/common';
app.useGlobalPipes(new ValidationPipe());

数据库操作(TypeORM+MySql)

安装依赖

npm i typeorm mysql

数据源

实体

装饰器

实体是由@Entity装饰器装饰的模型。

typescript 复制代码
// name对应数据库表名,schema对应数据库名,name可简写
@Entity({name:"table_name",schema:"schema_name"})
@Entity({"table_name",schema:"schema_name"})

表列是由@Column装饰器装饰的实体属性。

主列是由@PrimaryColumn装饰器装饰的实体属性。

自动生成的列是由@PrimaryGeneratedColumn装饰器装饰的实体属性。

列数据类型

数据类型一般会根据实体属性定义的类型进行推断,如:number将被转换为integer,string将转换为varchar,boolean转换为bool等。也可以自行设置,如下:

typescript 复制代码
// type可以简写
@Column("int")

@Column({type: "int"})

@Colunm("int", {name: "field_name", length: 100, unique: true, ...})

更多配置

关系

typescript 复制代码
import { Entity, Column, PrimaryGeneratedColumn, ManyToOne, OneToMany, OneToOne, JoinColumn } from "typeorm";

@Entity()
export class Category {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column()
    description: string;

	@OneToOne(type => Category)
	@JoinColumn()
	item: Category;

    @OneToMany(type => Category, category => category.children)
    parent: Category;

    @ManyToOne(type => Category, category => category.parent)
    children: Category;
}

@OneToOne:一对一
@OneToMany:一对多,总是包含反向关系,不能单独出现,需要和@ManyToOne一起使用,关系拥有者为多对一的一侧
@ManyToOne:多对一
@JoinColumn:实体键的对应关系,仅在关系的一侧使用,关系拥有者使用,关系的拥有方包含数据库中具有外键的列
TODO:多对多比较复杂,还需研究
@ManyToMany:多对多
@JoinTable():需要指定这是关系的所有者方

参数1,type=>Category,返回当前实体想要建立关系的目标实体类

参数2,category=>category.xxx,用以指定反向关系,当前实体存储在目标实体的xxx属性

Entity Manager 和 Repository

Entity Manager,实体管理器,可以管理(insert, update, delete, load 等)任何实体。EntityManager 就像放一个实体存储库的集合的地方。

Repository就像EntityManager一样,但其操作仅限于具体实体。

相关推荐
呼噜想睡觉11 分钟前
Bootstrap 组件之响应式导航条实现
学习
菜鸟‍38 分钟前
【论文学习】Medical Image Analysis 2024 || 医学图像分割中失败检测方法的比较基准研究:揭示置信度聚合的作用
人工智能·学习
爱音乐的marlon1 小时前
FastAPI 学习笔记03|core 核心层:config 是总控制台,database 是整个工程的地基
笔记·学习·fastapi
math_hongfan3 小时前
鸿蒙离线数据缓存高级架构:弱网预加载/离线数据优先级/同步冲突解决/上线后数据合并策略
学习·缓存·华为·架构·harmonyos·鸿蒙
划水的code搬运工小李3 小时前
Simulink学习-自定义Storage Class配置
学习
一尘之中4 小时前
量子计算机能“参禅”吗?从叠加态到不二法门的技术哲学追问
学习·ai写作·量子计算
什么都干的派森5 小时前
高速PCB设计学习记录(更新中)
学习·高速pcb设计
在世修行5 小时前
从零打造 C# 工业视觉检测系统(九):工厂模式实现 SQL Server / MySQL / SQLite 三库切换
mysql·sqlite·c#·工厂模式
ha_lydms5 小时前
Hologres分区表
大数据·mysql·阿里云·实时数仓·hologres·调度·aliyun
lifallen5 小时前
Emdash 拆解:多 Agent 并行开发桌面端的实现思路,兼谈 ACP 与 A2A
人工智能·学习·ai·ai编程