一、拦截器
-
全局响应拦截器
自定义httpResponse 文件
// 1、自定义response 文件 import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common' import { map } from 'rxjs/operators' import { Observable } from 'rxjs' interface Data<T> { data: T } @Injectable() export class HttpResponse implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<Data<T>> { return next.handle().pipe(map(data => { // 自定义返回给前端的内容 return { data, status: 0, message: 'ok', success: true } })) } }
在main.ts 中引入httpResponse
import { HttpResponse } from './common/httpResponse' app.useGlobalInterceptors(new CustomResponse())
-
全局异常拦截器
自定义httpFilter.ts 文件
import { Catch, ExceptionFilter, HttpException, ArgumentsHost } from '@nestjs/common' import { Request, Response } from 'express' @Catch() export class HttpFilter implements { catch(exception: HttpException, host: ArgumentsHost) { const ctx = host.switchToHttp() const request = ctx.getRequest<Request>() const response = ctx.getResponse<Response>() const status = exception.getStatus() response.status(status).json({ // 自定义返回给前端的内容 status, success: false, data: null, time: new Date(), message: exception.message, path: request.url }) } }
在main.ts 中引入httpFilter.ts 文件
import { HttpFilter } from './common/httpFilter' app.useGlobalFilters(new HttpFilter())
二、管道
1. 管道转换
import { ParseIntPipe, ParseFloatPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe, DefaultValuePipe, ValidationPipe, Controller, Get, Param } from '@nestjs/commont'
@Controller()
export class UserController {
Get('id')
findUser(@Param('id', ParseIntPipe) id: number) {
// 将string id 转换成number
}
}
2. 管道验证
一、自定义管道验证
安装必要模块
npm i class-validator class-transformer -S
1、创建login.pipe.ts
import { ArgumentMetadata, HttpException, Injectable, PipeTransform, HttpStatus } from '@nestjs/common';
import { plainToInstance } from 'class-transformer'
import { validate } from 'class-validator'
@Injectable()
export class LoginPipe implements PipeTransform {
async transform(value: any, metadata: ArgumentMetadata) {
console.log('value:', value);
console.log('metadata:', metadata);
const DTO = plainToInstance(metadata.metatype, value)
const errors = await validate(DTO)
if (errors.length) {
throw new HttpException(errors, HttpStatus.BAD_REQUEST)
}
console.log('errors:', errors);
return value;
}
}
2、配置login.dto.ts
import { IsNotEmpty, IsString, Length, IsNumber } from 'class-validator'
export class CreateLoginDto {
@IsNotEmpty({
message: '不能为空'
})
@IsString()
@Length(5, 10, {
message: '不能超过十个字符'
})
name: string
@IsNumber()
age: string
}
3、在controller文件中引入
import { Controller, Body } from '@nestjs/common'
import { LoginDto } from './login.dto'
import { LoginPipe } from './login.pipe'
@Controller()
export class LoginController {
@Post()
@login(@Body(LoginPipe loginDto: LoginDto) {
}
}
二、使用nestjs 自带的ValidationPipe(需要在dto 文件中配置好校验规则)
import { ValidationPipe } from '@nestjs/common'
app.useGlobalPipes(new ValidationPipe())