nest

225 阅读3分钟

文档

docs.nestjs.cn/

目录

先理一下执行的顺序

dist 文件夹

nest 运行的是打包后的 dist 文件夹

src

main.ts

入口文件

//创建app应用,内容为AppModule
const app = await NestFactory.create(AppModule);

app.module.ts

//装饰器
@Module({
    imports: [],
    controllers: [AppController], //1.通过controllers加载进来
    providers: [AppService], //2.运行
})
export class AppModule {} //AppModule使用装饰器装饰的

app.controller.ts

//装饰器
@Controller() //路由
export class AppController {
    // 依赖注入的方式将AppService引入进来
    constructor(private readonly appService: AppService) {}

    @Get() //http的请求方法参数是地址
    getHello(): string {
        return this.appService.getHello(); //前面依赖注入的appService
    }
}

app.service.ts

@Injectable()
export class AppService {
    getHello(): string {
        return "Hello World!";
    }
}

模块

docs.nestjs.cn/9/modules

  • providers 数据来源的、(service)
  • controllers 处理业务的
  • imports 引入第三方模块,如 mogndb,子模块
  • exports 给别的模块提供服务

cli 指令(generate|g)

nest g mo|module name 生成 module nest g co|controller name 生成 controller nest g s|service name 生成 service

nest g res|resourse name 生成完整的模块 ... 其余使用 nest 命令看吧

swagger

docs.nestjs.cn/9/recipes?i…

const options = new DocumentBuilder() //编译
    .setTitle("接口文档") //标题
    .setDescription("描述") //描述
    .setVersion("1.0") //版本
    // .addTag('cats')//添加标签
    .build(); //执行
const document = SwaggerModule.createDocument(app, options);
SwaggerModule.setup("docs", app, document); //docs为地址

模块标签

import { ApiTags } from '@nestjs/swagger';

@ApiTags("Video")
@Controller('video')

方法描述

  @Post()
  @ApiOperation({summary:'添加video'})

规定携带参数

  @Post()
  @ApiOperation({summary:'添加video'})
  // @Body():装饰器,将body请求体的数据给createVideoDto上
  create(@Body() createVideoDto: CreateVideoDto) {
    return this.videoService.create(createVideoDto);
  }


//CreateVideoDto
import { ApiProperty } from '@nestjs/swagger';
export class CreateVideoDto {
  //配合swagger
  @ApiProperty({ description: '邮箱', default: 'nameA@qq.com' })
  readonly email: string;
  @ApiProperty({ description: '密码' })
  password: string;
  @ApiProperty({ description: '用户名' })
  readonly username: string;
  @ApiProperty({ description: '手机号' })
  readonly phone: string;
}

装饰器

blog.csdn.net/getTheChees…

@Controller() //对AppController类的说明,AppController类是专门作为Controller使用
export class AppController

依赖注入和 Providers

docs.nestjs.cn/9/providers

想依赖注入就得有个 Provider(提供者)

angular.cn/guide/depen… 想用一个类,正常情况下会引入然后 new,依赖注入就是直接拿过来用,不用 new,提供这个类的就是 providers

MongoDB

docs.nestjs.cn/9/technique…

1.npm install --save @nestjs/mongoose mongoose 2. app.module.ts

@Module({
imports: [MongooseModule.forRoot('mongodb://localhost/nest')],
})

3.User 模块创建 Scheam 文件夹

//user.schema.ts
import { Schema, Prop, SchemaFactory } from "@nestjs/mongoose";
import { Document } from "mongoose";

export type UsersDocument = User & Document;

@Schema()
export class User extends Document {
    @Prop({ required: true })
    username: string;

    @Prop({ required: true })
    email: string;

    @Prop({ required: true, select: false })
    pasword: string;

    @Prop({ required: true })
    phone: string;
}

export const UserSchema = SchemaFactory.createForClass(User);
  1. User 模块引入
    import { MongooseModule } from '@nestjs/mongoose';
    import { User, UserSchema } from './schema/user.schema';
    @Module({
    imports: [
     MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])],
    
  2. service 使用
 import { InjectModel } from '@nestjs/mongoose';
 import { Model } from 'mongoose';
 import { UsersDocument, User } from './schema/user.schema';

  constructor(
  @InjectModel(User.name) private usersModel: Model<UsersDocument>,
) {

}

中间件

docs.nestjs.cn/9/middlewar…

nets g mi logger

middle

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
    use(req: any, res: any, next: () => void) {
        console.log("nnnnnnnnnnnnnnnnnnn");
        next();
    }
}

使用

export class AppModule {
    configure(consumer: MiddlewareConsumer) {
        consumer
            // consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
            //控制器下面加就是控制器内所有请求
            .apply(LoggerMiddleware, logger)
            .exclude({ path: "/api/v1/list", method: RequestMethod.GET }) //忽略
            .forRoutes(AppController, UserController); //路由
    }
}

函数式中间件

// middle
export function logger(req, res, next) {
    console.log(`Request...`);
    next();
}

app.use(logger)
    //或者
    .apply(LoggerMiddleware, logger);

异常处理

docs.nestjs.cn/9/exception…

管道(校验)

docs.nestjs.cn/9/pipes

自定义管道

1. nest g pi xxx

$ npm install --save joi
$ npm install --save-dev @types/joi

//pipe
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import { ObjectSchema } from 'joi';

@Injectable()
export class JoiValidationPipe implements PipeTransform {
  constructor(private schema: ObjectSchema) {}
//transform必须要有
  transform(value: any, metadata: ArgumentMetadata) {
    const { error } = this.schema.validate(value);
    if (error) {
      throw new BadRequestException('Validation failed');
    }
    return value;
  }
}

//使用
const Joi = require('joi')
@Post()
@UsePipes(new JoiValidationPipe(      Joi.object({
        username: Joi.string().required(),
        password: Joi.string().min(3).max(20).required(),
        email: Joi.string().email().required(),
        phone: Joi.string().required(),
      }),))
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}

守卫

docs.nestjs.cn/9/guards

nest g gu auth 

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    console.log('token',context.switchToHttp().getRequest().rawHeaders[1]);
    console.log('url',context.switchToHttp().getRequest()._parsedUrl);
    return true;
  }
}

//使用
@Controller('cats') | @Post()
@UseGuards(RolesGuard)

app.useGlobalGuards(new RolesGuard());