Nest 快速上手 —— (三)中间件 / 异常过滤器

一、 中间件(Middleware)

1.特点

中间件是一个在路由处理程序之前被调用的函数。中间件函数可以访问请求和响应对象,以及应用程序请求-响应周期中的next()中间件函数。下一个中间件函数通常由一个名为next的变量表示。

中间件函数可以执行以下任务:

1、执行任何代码。

2、对请求和响应对象进行更改。

3、结束请求-响应周期。

4、调用堆栈中的下一个中间件函数。

如果当前中间件函数没有结束请求-响应周期,它必须调用next()将控制传递给下一个中间件函数。否则,请求将被挂起。

支持依赖注入的方式进行使用

2.1 应用中间件

LoggerMiddleware将被绑定到catscontroller内部定义的所有路由,除了传递给exclude()方法的三个路由。

javascript 复制代码
//logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log('Cross Middleware ,Request...');
    next();
  }
}
javascript 复制代码
//app.module.ts
@Module({
  imports: [KeysModule, UsersModule, DatabaseModule, LoggerModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      // 从中间件中排除一些路由
      //.exclude(
      //  { path: 'users', method: RequestMethod.GET },
      //  { path: 'users', method: RequestMethod.POST },
      //  'users/(.*)',
      //)
      // .forRoutes('users');
      // .forRoutes({ path: 'users', method: RequestMethod.GET });
      .forRoutes(UsersController);
  }
}

测试结果:

二、异常过滤器(Exception filters)

1.特点

Nest有一个内置的异常层,负责处理整个应用程序中所有未处理的异常。当应用程序代码没有处理异常时,该层将捕获异常,然后自动发送适当的用户友好响应。

当异常无法识别时(既不是HttpException也不是继承自HttpException的类),内置异常过滤器会生成以下默认JSON响应:

javascript 复制代码
{
  "statusCode": 500,
  "message": "Internal server error"
}

相关的HTTP 状态码,可以参考https://seo.juziseo.com/doc/http_code/

2.1 抛出标准的异常
javascript 复制代码
  @Get()
  findAll() {
    // return this.keysService.findAll();
    throw new HttpException('Forbideden', HttpStatus.FORBIDDEN);
  }
2.2 自定义异常
javascript 复制代码
//forbidden.exception.ts
export class ForBiddenException extends HttpException {
  constructor() {
    super('Forbidden', HttpStatus.UNAUTHORIZED);
  }
}
javascript 复制代码
//keys.controller.ts
@Get()
  findAll() {
    // return this.keysService.findAll();
    // throw new HttpException('Forbideden', HttpStatus.FORBIDDEN);
    throw new ForBiddenException();
  }
2.3 Http内置的Http异常
  • BadRequestException
    • 客户端发送了一个服务器无法理解的请求。
  • UnauthorizedException
    • 客户端需要进行身份验证才能访问请求的资源。
  • NotFoundException
    • 服务器找不到请求的资源。
  • ForbiddenException
    • 客户端没有权限访问请求的资源。
  • NotAcceptableException
    • 服务器无法根据请求的内容特性完成请求。
  • RequestTimeoutException
    • 客户端请求超时。
  • ConflictException
    • 表示请求与服务器当前状态冲突。
  • GoneException
    • 表示请求的资源不再可用。
  • HttpVersionNotSupportedException
    • 表示服务器不支持请求中使用的 HTTP 版本
  • PayloadTooLargeException
    • 表示请求的负载过大,服务器无法处理。
  • UnsupportedMediaTypeException
    • 表示服务器不支持请求中的媒体类型。
  • UnprocessableEntityException
    • 表示服务器无法处理请求的实体。
  • InternalServerErrorException
    • 表示服务器遇到了意外的情况,无法完成请求。
  • NotImplementedException
    • 表示服务器不支持请求中要求的功能。
  • ImATeapotException
    • 表示服务器是一个茶壶,不支持被要求的操作。
  • MethodNotAllowedException
    • 表示服务器不支持请求中指定的方法。
  • BadGatewayException
    • 表示服务器作为网关或代理时从上游服务器接收到无效响应。
  • ServiceUnavailableException
    • 表示服务器暂时无法处理请求。
  • GatewayTimeoutException
    • 表示服务器作为网关或代理时无法从上游服务器获取响应,超时了。
  • PreconditionFailedException
    • 表示请求头中指定的条件不满足。
相关推荐
fuquxiaoguang3 小时前
中间件行业产品市场洞察报告 – 2026年第一季度
中间件·市场洞察
fuquxiaoguang4 小时前
灰度·熵减·长期主义:任正非心智模型下的中国中间件技术突围与未来
中间件·任正非
van久1 天前
Day10:ASP.NET Core 管道与中间件
中间件
We་ct1 天前
JS手撕:手写Koa中间件与Promise核心特性
开发语言·前端·javascript·中间件·node.js·koa·co
Meme Buoy4 天前
13.6其他架构评估方法-中间件
中间件·架构
我是李龙5 天前
第二十六章 全链路监控体系: 服务器资源、中间件状态与业务指标的可视化大屏开发
中间件
别抢我的锅包肉6 天前
FastAPI + Vue3 + Vite 跨域报错全解:从 `Access-Control-Allow-Origin missing` 到彻底修复
中间件·状态模式·fastapi
爱吃烤鸡翅的酸菜鱼6 天前
Java 事件发布-订阅机制全解析:从原生实现到主流中间件
java·中间件·wpf·事件·发布订阅
my_styles6 天前
linux系统下安装 tengine / 宝兰德等国产信创中间件和闭坑
linux·运维·服务器·spring boot·nginx·中间件
ZHENGZJM6 天前
Gin 鉴权中间件设计与实现
中间件·gin