网站首页 > 文章精选 正文
前言
当一个请求到达你的 NestJS 应用时,它会经历一系列的处理步骤,这些步骤确保数据的安全、完整和有效。NestJS 提供了多种工具,如中间件、守卫、拦截器、管道和过滤器,每一种工具在请求生命周期中都扮演着关键角色。理解这些工具的工作机制和相互关系,有助于你在构建应用时更加得心应手。
本文将详细介绍这些工具的功能及其在请求处理流程中的位置。
流程图
模块具体详情
- 中间件(Middleware)
概念
中间件是一个函数,它在请求被路由处理之前被调用。中间件的主要作用是处理请求对象、响应对象以及应用程序的请求-响应周期中的其他中间件功能。
具体功能
- 修改请求和响应对象:可以添加、修改或删除请求和响应的属性。
- 终止请求-响应周期:可以在中间件中发送响应,终止请求-响应的流程。
- 调用下一个中间件:如果当前中间件没有终止请求-响应周期,则必须调用 next() 方法来将控制权交给下一个中间件。
示例
import { NestMiddleware, Injectable } from '@nestjs/common';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
console.log('Request...');
next();
}
}
- 守卫(Guards)
概念
守卫用于认证和授权。它们在路由处理器(即控制器方法)之前执行,可以决定是否允许某个请求通过。
具体功能
- 权限验证:可以根据用户权限、角色等信息决定是否允许执行某个操作。
- 请求拦截:如果某个请求不满足条件,可以在守卫中直接拦截。
示例
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class RolesGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
const user = request.user;
return user && user.roles.includes('admin');
}
}
- 拦截器(Interceptor)
概念
拦截器是 NestJS 特有的概念,它可以在方法执行之前或之后对方法调用进行完全控制。拦截器可以通过装饰器来应用到控制器或单个路由上。
具体功能
- 绑定额外的逻辑:在函数执行之前或之后进行额外的逻辑处理。
- 转换结果:可以在返回结果前对其进行转换或处理。
- 错误处理:可以捕获和处理方法调用中的异常。
- 延迟执行:可以延迟函数的执行,例如模拟异步操作。
示例
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> {
intercept(context: ExecutionContext, next: CallHandler): Observable<Response<T>> {
return next.handle().pipe(map(data => ({ data })));
}
}
- 管道(Pipes)
概念
管道用于转换和验证数据。它们在参数注入到控制器的方法之前执行,可以对传入的数据进行验证和转换。
具体功能
- 数据转换:可以将传入的参数转换为所需的类型,例如将字符串转换为整数。
- 数据验证:可以验证传入的数据是否符合期望的格式或规则,如果不符合,可以抛出异常。
示例
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
@Injectable()
export class ParseIntPipe implements PipeTransform<string, number> {
transform(value: string, metadata: ArgumentMetadata): number {
const val = parseInt(value, 10);
if (isNaN(val)) {
throw new BadRequestException('Validation failed');
}
return val;
}
}
- 过滤器(Filter)
概念
过滤器是用于捕获和处理异常的,NestJS 提供了一种干净的方式来处理控制器中抛出的异常。异常过滤器可以自定义应用程序的错误响应结构。
具体功能
- 捕获异常:可以捕获在控制器或服务中抛出的异常。
- 自定义响应:可以根据捕获的异常类型,自定义返回给客户端的响应。
- 日志记录:可以在捕获异常的同时记录日志或执行其他副作用。
示例
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const status = exception.getStatus();
response.status(status).json({
statusCode: status,
timestamp: new Date().toISOString(),
path: ctx.getRequest().url,
});
}
}
总结
在 NestJS 中,中间件、守卫、拦截器、管道和过滤器各自扮演着独特的角色:
- 中间件:用于预处理请求。
- 守卫:用于控制访问权限。
- 拦截器:用于添加额外的请求/响应处理逻辑。
- 管道:用于验证和转换数据。
- 过滤器:用于处理异常。
这些功能模块共同协作,确保请求在到达最终处理器时已经经过一系列严格的验证和处理,从而提高了应用的健壮性和安全性。
希望这篇文章能帮助你更好地理解 NestJS 的请求处理流程,并在实际开发中得心应手。
猜你喜欢
- 2025-06-10 第五天快http头部信息注入cooik(http 头部信息)
- 2025-06-10 HttpUrlConnection发送url请求(后台springmvc)
- 2025-06-10 你看过的动画片没有一个能逃过这10大定律,不信来试试
- 2025-06-10 如何给你的网站申请一个免费SSL,让HTTP变HTTPS
- 2025-06-10 前端常见面试 - 请求篇(前端面试经典问题)
- 2025-06-10 地球的关键瞬间(地球的k)
- 2025-06-10 09《Nginx 入门教程》Nginx 的 Http 模块介绍(下)
- 2025-06-10 使用Python并发执行HTTP请求(python并发处理)
- 2025-06-10 HTTP 响应状态码你知道多少?(http响应状态码的含义)
- 2025-06-10 Python3 新一代Http请求库Httpx使用(详情版)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)