nest项目初始化命令

1、安装nest脚手架,和初始化项目

npm i -g @nestjs/cli
nest new project-name

2、安装swagger

npm install --save @nestjs/swagger swagger-ui-express

2.1、main.ts,bootstrap函数内

// swagger配置
  const options = new DocumentBuilder()
    .setTitle('nestjs博客api')
    .setDescription('nestjs博客')
    .setVersion('1.0')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('api-docs', app, document);

2.2、常用配置参数

// 定义接口组,controller中
@ApiTags('帖子')
// 定义单个接口,controller中
@ApiOperation({ summary: '帖子列表' })
// 定义swagger参数名称,model中
@ApiProperty({description: '帖子标题',example: '测试帖子标题',})

3、使用pipe进行参数校验

npm i --save class-validator class-transformer

3.1、main.ts中开启管道校验

import { ValidationPipe } from '@nestjs/common';
// 开起校验管道,bootstrap中
app.useGlobalPipes(new ValidationPipe());

3.2、对应的model中进行参数校验,例如:post.model.ts

import { IsNotEmpty } from 'class-validator';
// 参数校验
@IsNotEmpty({ message: '标题不能为空' })

4、使用mongodb,包含上面内容完整的代码

npm i @typegoose/typegoose nestjs-typegoose mongoose -S

4.1、连接mongodb数据库,app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PostsModule } from './posts/posts.module';
import { TypegooseModule } from 'nestjs-typegoose';

@Module({
  imports: [
    // 连接mongodb
    TypegooseModule.forRoot('mongodb://localhost:27017/nest-blog-api', {
      // useNewUrlParser: true,
    }),
    PostsModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

4.2、创建模型,post.model.ts

import { ApiProperty } from '@nestjs/swagger';
import { prop } from '@typegoose/typegoose';
import { IsNotEmpty } from 'class-validator';

// 数据库模型
export class Post {
  // swagger的参数名称
  @ApiProperty({
    description: '帖子标题',
    example: '测试帖子标题',
  })
  // 参数校验
  @IsNotEmpty({ message: '标题不能为空' })
  @prop()
  title?: string;

  @ApiProperty({
    description: '帖子详情',
    example: '测试帖子内容',
  })
  @prop()
  content?: string;

  @prop()
  createTime?: string;

  @ApiProperty({
    description: '创建人',
    example: '创建人11',
    required: false,
  })
  @prop()
  createBy?: string;

  @prop()
  updateTime?: string;

  @ApiProperty({
    description: '更新人',
    example: '更新人11',
    required: false,
  })
  @prop()
  updateBy?: string;

  @ApiProperty({
    description: '数据状态:false:未删除,true:已删除',
    example: false,
    required: false,
  })
  @prop()
  del_flag?: boolean;
}


// 搜索条件模型
export class SearchDto {
  @ApiProperty({ description: '第几页', example: 1 })
  pageIndex: number;

  @ApiProperty({ description: '一页多少条', example: 10 })
  pageSize: number;

  @ApiProperty({
    description: '帖子详情',
    required: false,
  })
  title: string;

  @ApiProperty({
    description: '帖子详情',
    required: false,
  })
  content: string;
}

4.3、module中注册模型,posts.module.ts

import { Module } from '@nestjs/common';
import { TypegooseModule } from 'nestjs-typegoose';
import { Post } from './post.model';
import { PostsController } from './posts.controller';
import { PostsService } from './posts.service';

@Module({
  // 1.模块中注册数据库模型
  imports: [TypegooseModule.forFeature([Post])],
  controllers: [PostsController],
  providers: [PostsService],
})
export class PostsModule {}

4.4、service中使用模型,基础的crud,posts.service.ts

import { Injectable } from '@nestjs/common';
import { ReturnModelType } from '@typegoose/typegoose';
import { InjectModel } from 'nestjs-typegoose';
import { Post as PostSchema } from './post.model';
import { getNowTime } from '../utils/dateTime';

@Injectable()
export class PostsService {
  constructor(
    // 2.引入model,使用模型
    @InjectModel(PostSchema)
    private readonly postModel: ReturnModelType,
  ) {}
  // 分页查询
  async getPageList(data) {
    // MongoDB模型方法
    const { pageIndex, pageSize, title, content } = data;

    // 组装模糊搜索条件
    const search = {
      del_flag: false,
      title: new RegExp(title),
      content: new RegExp(content),
    };

    // 获取总数
    const total = await this.postModel.find(search).count();
    // 分页数据
    const result = await this.postModel
      .find(search)
      .skip((pageIndex - 1) * pageSize) //跳过的条数
      .limit(pageSize); //查询几条

    return {
      pageIndex,
      pageSize,
      total,
      result,
    };
  }

  // 新增
  async add(data: PostSchema) {
    data.createTime = getNowTime();
    data.updateTime = getNowTime();
    await this.postModel.create(data);
    return {
      success: true,
    };
  }

  // 详情
  async detail(id) {
    return await this.postModel.findById(id);
  }

  // 修改
  async update(id, data: PostSchema) {
    data.updateTime = getNowTime();
    await this.postModel.findByIdAndUpdate(id, data);
    return {
      success: true,
    };
  }

  // 删除
  async remove(id) {
    // 物理删除
    // await this.postModel.findByIdAndDelete(id);
    // 逻辑删除
    const updatePostDto: PostSchema = {
      updateTime: getNowTime(),
      del_flag: true,
    };
    await this.postModel.findByIdAndUpdate(id, updatePostDto);
    return {
      success: true,
    };
  }
}

4.5、controller中使用service,基础的crud,posts.controller.ts

import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Post,
  Put,
  Query,
} from '@nestjs/common';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { Post as PostSchema, SearchDto } from './post.model';
import { PostsService } from './posts.service';

@Controller('posts')
// swagger接口分组
@ApiTags('帖子')
export class PostsController {
  // 引入service
  constructor(private readonly postsService: PostsService) {}

  @Get()
  //   swagger的接口信息定义
  @ApiOperation({ summary: '帖子列表' })
  index(@Query() searchDto: SearchDto) {
    return this.postsService.getPageList(searchDto);
  }

  @Post()
  @ApiOperation({ summary: '创建帖子' })
  // 修饰器是修饰变量,不能单独存在
  async create(@Body() createPostDto: PostSchema) {
    return this.postsService.add(createPostDto);
  }

  @Get(':id')
  @ApiOperation({ summary: '帖子详情' })
  async detail(@Param('id') id: string) {
    return this.postsService.detail(id);
  }

  @Put(':id')
  @ApiOperation({ summary: '编辑帖子' })
  async update(@Param('id') id: string, @Body() updatePostDto: PostSchema) {
    return this.postsService.update(id, updatePostDto);
  }

  @Delete(':id')
  @ApiOperation({ summary: '删除帖子' })
  async remove(@Param('id') id: string) {
    return this.postsService.remove(id);
  }
}

你可能感兴趣的:(nest项目初始化命令)