文章问题导向
如何使用管道?
如何使用守卫?
如何使用拦截器?
如何使用过滤器?
如何使用中间件?
如果你都有了答案,可以忽略本文章,或去nest学习导图寻找更多答案
分别作用
管道:数据处理与转换,数据验证
守卫:验证用户登陆,保护路由
拦截器:对请求响应进行拦截,统一响应内容
过滤器:异常捕获
中间件:日志打印
装饰器:获取数据,实现守卫
更多使用方式,请了解执行时机再选用适用的方式
执行顺序(时机)
使用(注册)方式
两种使用方式:局部,全局
两种使用类型:内置,自定义
全局使用: 管道 - 守卫 - 拦截器 - 过滤器 - 中间件
统一在main.ts文件中使用,全局生效
import {
NestFactory } from '@nestjs/core';
import {
ParseIntPipe } from '@nestjs/common';
import {
AppModule } from './app.module';
import {
HttpExceptionFilter } from './common/filters/http-exception.filter';
import {
LoggerMiddleware } from './common/middleware/logger.middleware';
import {
AuthGuard } from './common/guard/auth.guard';
import {
AuthInterceptor } from './common/interceptors/auth.interceptor';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
//全局使用管道:这里使用的是内置,也可以使用自定义管道,在下文
app.useGlobalPipes(new ParseIntPipe());
//全局使用中间件
app.use(LoggerMiddleware)
//全局使用过滤器
//这里使用的是自定义过滤器,先别管,先学会怎么在全局使用
app.useGlobalFilters(new HttpExceptionFilter());
//全局使用守卫
app.useGlobalGuards(new AuthGuard());
//全局使用拦截器
app.useGlobalInterceptors(new AuthInterceptor());
await app.listen(3000);
}
bootstrap();
管道
内置管道
常用内置管道,从@nestjs/common导出
ParseIntPipe:将字符串数字转数字
ValidationPipe:验证管道
更多待更新
局部使用管道
局部有三种使用方式
- 匹配整个路径,使用UseFilters
- 只匹配某个接口,使用UseFilters
- 在获取参数时匹配,一般使用内置管道
例子
import {
Controller,
Get,
Put,
Body,
Param,
UsePipes,
ParseIntPipe
} from '@nestjs/common';
import {
myPipe } from '../../common/pipes/user.pipe';
@Controller('user')
@UsePipes(new myPipe()) //局部方式1:匹配整个/user, get请求和put请求都会命中
export class UserController {
@Get(':id')
getUserById(@Param('id', new ParseIntPipe()) id) {
//局部方式3:只匹配/user的get请求,使用的是内置管道
console.log('user', typeof id);
return id;
}
@Put(':id')
@UsePipes(new myPipe()) //局部方式2:只匹配/user的put请求
updateUser(@Body() user