程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

当一个HTTP请求发送到NestJS服务器后都经历了什么?

balukai 2025-06-10 13:09:07 文章精选 5 ℃

前言

当一个请求到达你的 NestJS 应用时,它会经历一系列的处理步骤,这些步骤确保数据的安全、完整和有效。NestJS 提供了多种工具,如中间件、守卫、拦截器、管道和过滤器,每一种工具在请求生命周期中都扮演着关键角色。理解这些工具的工作机制和相互关系,有助于你在构建应用时更加得心应手。

本文将详细介绍这些工具的功能及其在请求处理流程中的位置。


流程图


模块具体详情

  1. 中间件(Middleware)

概念

中间件是一个函数,它在请求被路由处理之前被调用。中间件的主要作用是处理请求对象、响应对象以及应用程序的请求-响应周期中的其他中间件功能。


具体功能

  1. 修改请求和响应对象:可以添加、修改或删除请求和响应的属性。
  2. 终止请求-响应周期:可以在中间件中发送响应,终止请求-响应的流程。
  3. 调用下一个中间件:如果当前中间件没有终止请求-响应周期,则必须调用 next() 方法来将控制权交给下一个中间件。


示例

import { NestMiddleware, Injectable } from '@nestjs/common';

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


  1. 守卫(Guards)

概念

守卫用于认证和授权。它们在路由处理器(即控制器方法)之前执行,可以决定是否允许某个请求通过。


具体功能

  1. 权限验证:可以根据用户权限、角色等信息决定是否允许执行某个操作。
  2. 请求拦截:如果某个请求不满足条件,可以在守卫中直接拦截。

示例

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');
  }
}


  1. 拦截器(Interceptor)

概念

拦截器是 NestJS 特有的概念,它可以在方法执行之前或之后对方法调用进行完全控制。拦截器可以通过装饰器来应用到控制器或单个路由上。


具体功能

  1. 绑定额外的逻辑:在函数执行之前或之后进行额外的逻辑处理。
  2. 转换结果:可以在返回结果前对其进行转换或处理。
  3. 错误处理:可以捕获和处理方法调用中的异常。
  4. 延迟执行:可以延迟函数的执行,例如模拟异步操作。


示例

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 })));
  }
}


  1. 管道(Pipes)

概念

管道用于转换和验证数据。它们在参数注入到控制器的方法之前执行,可以对传入的数据进行验证和转换。


具体功能

  1. 数据转换:可以将传入的参数转换为所需的类型,例如将字符串转换为整数。
  2. 数据验证:可以验证传入的数据是否符合期望的格式或规则,如果不符合,可以抛出异常。


示例

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;
  }
}


  1. 过滤器(Filter)

概念

过滤器是用于捕获和处理异常的,NestJS 提供了一种干净的方式来处理控制器中抛出的异常。异常过滤器可以自定义应用程序的错误响应结构。


具体功能

  1. 捕获异常:可以捕获在控制器或服务中抛出的异常。
  2. 自定义响应:可以根据捕获的异常类型,自定义返回给客户端的响应。
  3. 日志记录:可以在捕获异常的同时记录日志或执行其他副作用。


示例

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 的请求处理流程,并在实际开发中得心应手。

Tags:

最近发表
标签列表