Nest结合TypeOrm实践 -- 手把手教前端写接口

1,024 阅读2分钟

准备工作 1、安装mysql 2、安装navicat软件并建立一个名为ormTest的数据库,密码123456,utf-8,

一、配置

结合实际使用,用nest创建一个项目,先创建一个模块,nest g resource photo

安装TypeOrm

1、npm install --save @nestjs/typeorm typeorm mysql2

2、npm install reflect-metadata --save

3、在main.ts中import 'reflect-metadata'

4、npm install @types/node --save

根目录增加ormconfig.json文件连接数据库

{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root",
  "password": "12345678",
  "database": "nestTest",
  "entities": ["dist/**/*.entity{.ts,.js}"],
  "synchronize": true
}

注意⚠️:synchronize必须为true,这样才能自动建表

app.module.ts下

import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    PhotoModule,
    TypeOrmModule.forRoot({
      autoLoadEntities: true,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

二、开始typeOrm实践

在生成的photo目录下,entites下的文件中

import { Entity, Column, PrimaryColumn } from "typeorm";

@Entity()
export class PhotoEntity {
    @PrimaryColumn()
    id: number;

    @Column()
    name: string;

    @Column()
    description: string;

    @Column()
    filename: string;

    @Column()
    views: number;

    @Column()
    isPublished: boolean;
}

运行nest程序,npm run start:dev

这时候去navicat就能看到多了一张Photo的表了

WX20220425-141354.png

以上就完成了简单的nest项目结合TypeOrm创建数据库表单

三、简单的CRUD

photo.modules.ts

...
import { TypeOrmModule } from '@nestjs/typeorm';
import { Photo } from './entities/photo.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Photo])],
  controllers: [PhotoController],
  providers: [PhotoService],
})
export class PhotoModule {}

1、首先写新增接口,这样才能创造数据 photo.service.ts用来处理逻辑

...
import { Photo } from './entities/photo.entity';

export class PhotoService {
  constructor(
    @InjectRepository(Photo)
    private readonly photoRepository: Repository<Photo>,
  ) {}
  // 创建
  async create(photo: Partial<Photo>) {
    const { name } = photo;
    if (!name) {
      throw new HttpException('缺少名称', 401);
    }
    const doc = await this.photoRepository.findOne({ where: { name } });
    if (doc) {
      throw new HttpException('照片已存在', 401);
    }
    return await this.photoRepository.save(photo);
  }
  }

photo.controller.ts

 @Post()
  async create(@Body() photo) {
    return await this.photoService.create(photo);
  }

打开postman,post请求接口,这时候我们发现navicat的photo表有了一条数据,成功!

WX20220425-170615@2x.png

2、查询列表接口 photo.service.ts

export interface PhotoRo {
  list: Photo[];
  pages: number;
  current: number;
  size: number;
  total: number;
}

  //  获取列表
  async findAll(query): Promise<PhotoRo> {
    const qb = await getRepository(Photo).createQueryBuilder('phote');
    qb.where('1=1');
    const count = await qb.getCount();
    const { pageNum = 1, pageSize = 10, ...params } = query;
    qb.limit(pageSize);
    qb.offset(pageSize * (pageNum - 1));
    const photo = await qb.getMany();
    return {
      list: photo,
      total: count,
      pages: Math.ceil(count / pageSize),
      current: pageNum,
      size: pageSize,
    };

photo.controller.ts

@Get()
  findAll(@Query() query): Promise<PhotoRo> {
    return this.photoService.findAll(query);
  }

请求列表.png 3、删除接口和更新接口大家可以自己发挥,通过:id,@Delete和@Put

那么到这里我们就简单掌握了nest,前端同学这时候可以建立一个前端项目去请求自己写的接口啦

但我们知道,业务远远不是这么简单, 所以接下来我们要继续深入学习TypeOrm,创建一对一关系,一对多关系,如何使用QueryBuilder等等

Nest非常强大,中间件、拦截器等等,通过实践可以做出自己想要的东西,掌握了后端技术,咱们怼后端也更有借口呀【不是】哈哈哈哈哈

文笔不好,如有疑问,欢迎添加微信交流【回复更及时】

WX20220425-175958.png