美文网首页
Nest.Js 快速构建RESTful风格接口方案

Nest.Js 快速构建RESTful风格接口方案

作者: 弱冠而不立 | 来源:发表于2020-06-30 09:29 被阅读0次

写在开头

  1. 首先安装@nestjs/cli npm i -g @nestjs/cli
    然后用nest命令新建项目(类似与vuecli) nest new project-name

创建一个用户类

  1. 使用CLI快速创建用户模块: nest g mo user 创建好后如下

    同时app模块中会自动导入用户模块
  2. 创建用户类型的控制器: nest g co user 创建好后如下

    同时user.module中会自动更改

    此时我们就可以在控制器中使用@Get() @Post @Put @Delete 装饰器 来构建路由
import { Controller, Get, Param, Post, Put, Delete } from '@nestjs/common';

@Controller('user')
export class UserController {

    @Get()
    findAll() {}

    @Get(":id")
    findOneById(@Param() id: string) {}

    @Post()
    create() {}

    @Put()
    update() {}

    @Delete()
    remove() {}
}

使用typegoose 构造模型

nestjs-typegoose文档参考链接

  1. 安装依赖包
npm i -s @typegoose/typegoose mongoose nestjs-typegoose
npm i -D @types/mongoose
  1. 创建一个user.model.ts文件,内容如下
import { prop } from '@typegoose/typegoose';

export class User {
    @prop()
    username: string
    @prop()
    password: string
}
  1. 在user.module下导入user模型
import { User } from './user.model';
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { TypegooseModule } from 'nestjs-typegoose';

@Module({
  imports: [TypegooseModule.forFeature([User])],
  controllers: [UserController],
  providers: [UserService]
})
export class UserModule {}

在service层进行数据库操作

  1. 在app.module中写入数据库链接
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { TypegooseModule } from 'nestjs-typegoose';

@Module({
  imports: [
    TypegooseModule.forRoot("mongodb://localhost:27017/nest-lab-api" , {
      useNewUrlParser: true
    }),
    UserModule
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

  1. 新建一个user.service.ts文件,并采用依赖注入的方式注入user模型
import { ModelType } from '@typegoose/typegoose/lib/types';
import { InjectModel } from 'nestjs-typegoose';
import { Injectable } from '@nestjs/common';
import { User } from "./user.model"

@Injectable()
export class UserService {
    constructor(
        @InjectModel(User) private readonly userModel: ModelType<User>
    ){}

    async findAll() {
        return await this.userModel.find();
    }

    async findOneById(id: string) {
        return await this.userModel.findById(id);
    }

    async create(model: User) {
        await this.userModel.create(model);
        return {
            success: true
        }
    }

    async update(id: string, model: User) {
        await this.userModel.findByIdAndUpdate(id, model);
        return {
            success: true
        }
    }

    async remove(id: string) {
        await this.userModel.findByIdAndRemove(id);
        return {
            success: true
        }
    }
}

在控制器(user.controller)中使用UserService

import { User } from './user.model';
import { UserService } from './user.service';
import { Controller, Get, Param, Post, Put, Delete, Body } from '@nestjs/common';
import { ApiTags, ApiOperation } from '@nestjs/swagger';


@Controller('user')
@ApiTags("User")
export class UserController {
    constructor(
        private readonly userService: UserService
    ) {}

    @Get()
    @ApiOperation({
        summary: "获取全部用户数据"
    })
    async findAll() {
        return await this.userService.findAll();
    }

    @Get(":id")
    @ApiOperation({
        summary: "根据用户Id获取指定用户信息"
    })
    async findOneById(@Param("id") id: string) {
        return await this.userService.findOneById(id);
    }

    @Post()
    @ApiOperation({
        summary: "创建用户"
    })
    async create(@Body() user: User) {
        return await this.userService.create(user)
    }

    @Put(":id")
    @ApiOperation({
        summary: "根据用户Id更新用户信息"
    })
    async update(@Param("id") id: string, @Body() user: User) {
        return await this.userService.update(id, user);
    }

    @Delete(":id")
    @ApiOperation({
        summary: "根据用户Id删除用户"
    })
    async remove(@Param("id") id: string) {
        return await this.userService.remove(id);
    }
}

使用swagger自动生成接口文档

  1. 首先安装依赖包
npm install --save @nestjs/swagger swagger-ui-express 

文档参考链接

  1. 在 main.ts 中使用 SwaggerModule 类初始化 Swagger
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

 const options = new DocumentBuilder()
    //接口文档标题
    .setTitle('Nest api example')
    //接口文档描述
    .setDescription('The user API description')
    .setVersion('1.0')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('api-docs', app, document);

  await app.listen(3000);
}
bootstrap();
效果图
  1. 同时在user.controller中通过装饰器完善接口文档
import { Controller, Get, Param, Post, Put, Delete } from '@nestjs/common';
import { ApiTags, ApiOperation } from '@nestjs/swagger';

@Controller('user')
@ApiTags("User")
export class UserController {

    @Get()
    @ApiOperation({
        summary: "获取全部用户数据"
    })
    findAll() {}

    @Get(":id")
    @ApiOperation({
        summary: "根据用户Id获取指定用户信息"
    })
    findOneById(@Param("id") id: string) {
        return id;
    }

    @Post()
    @ApiOperation({
        summary: "创建用户"
    })
    create() {}

    @Put(":id")
    @ApiOperation({
        summary: "根据用户Id更新用户信息"
    })
    update(@Param("id") id: string) {}

    @Delete(":id")
    @ApiOperation({
        summary: "根据用户Id删除用户"
    })
    remove(@Param("id") id: string) {}
}
效果图

相关文章

网友评论

      本文标题:Nest.Js 快速构建RESTful风格接口方案

      本文链接:https://www.haomeiwen.com/subject/mdfafktx.html