[Nestjs] 中间件拦截机制

简介: 在NestJS中,中间件拦截机制提供了一种在请求和响应之间对请求进行拦截、修改或中断的方式。中间件拦截器可以用于执行通用的处理逻辑、路由守卫、身份验证、日志记录等操作。

中间件的工作原理:
中间件是一个可插入请求处理流程的函数,通过在请求到达控制器之前或响应返回客户端之前进行拦截处理。
中间件可以在整个应用程序或特定路由范围内进行注册和使用。
通过使用 @Injectable() 装饰器将中间件类标记为可注入的,并使用 MiddlewareConsumer 提供的方法来应用或排除中间件。

创建中间件:
创建一个中间件类,实现 NestMiddleware 接口,并在 use() 方法中定义你的中间件逻辑。

import {
    Injectable, NestMiddleware } from '@nestjs/common';
import {
    Request, Response, NextFunction } from 'express';

@Injectable()
export class MyMiddleware implements NestMiddleware {
   
  use(req: Request, res: Response, next: NextFunction) {
   
    // 中间件逻辑
    console.log('Request...');
    next();
  }
}


注册中间件:
在根模块(通常是 app.module.ts)或其它模块中引导应用程序时,使用 configure() 方法来注册和配置中间件。

import {
    MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import {
    MyMiddleware } from './my.middleware';
import {
    AppController } from './app.controller';
import {
    AppService } from './app.service';

@Module({
   
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
   
  configure(consumer: MiddlewareConsumer) {
   
    consumer.apply(MyMiddleware).forRoutes('*');
  }
}

中间件的使用范围:
中间件可以应用于所有路由(*)或指定的路由。
通过传递一个或多个路由路径来限定中间件的使用范围。

consumer.apply(MyMiddleware).forRoutes('users', 'products');
//或
consumer.apply(MyMiddleware).forRoutes({
    path: 'users', method: RequestMethod.GET });

异步中间件:
如果中间件需要进行异步操作,可以在 use() 方法中返回一个 Promise 或使用 async/await。

async use(req: Request, res: Response, next: NextFunction) {
   
  await someAsyncOperation();
  next();
}

通过使用NestJS的中间件拦截机制,你可以实现通用的处理逻辑、请求验证、日志记录等功能。中间件可以在请求到达控制器之前或响应返回客户端之前进行拦截和处理。这样可以更好地组织和重用代码,并提供可扩展和可定制的请求处理管道。

相关文章
|
4月前
|
前端开发 中间件
Nestjs(四)中间件常见使用方式(class、函数中间件)
Nestjs(四)中间件常见使用方式(class、函数中间件)
109 5
|
中间件
小满nestjs(第十二章 nestjs 中间件)
中间件是在路由处理程序 之前 调用的函数。 中间件函数可以访问请求和响应对象
216 2
小满nestjs(第十二章 nestjs 中间件)
|
4月前
|
消息中间件 存储 负载均衡
消息中间件的选择:RabbitMQ是一个明智的选择
消息中间件的选择:RabbitMQ是一个明智的选择
85 0
|
3月前
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
332 0
|
2月前
|
消息中间件 编解码 Docker
Docker部署RabbitMQ消息中间件
【7月更文挑战第4天】Docker部署RabbitMQ消息中间件
230 3
|
1月前
|
消息中间件 Java 测试技术
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】
这篇文章是关于如何在SpringBoot应用中整合RabbitMQ的消息中间件。内容包括了在SpringBoot项目中添加RabbitMQ的依赖、配置文件设置、启动类注解,以及如何通过单元测试来创建交换器、队列、绑定,并发送和接收消息。文章还介绍了如何配置消息转换器以支持对象的序列化和反序列化,以及如何使用注解`@RabbitListener`来接收消息。
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】
|
1月前
|
消息中间件 Docker 容器
消息中间件RabbitMQ---Docker安装RabbitMQ、以及RabbitMQ的基本使用【二】
这篇文章提供了RabbitMQ的安装和基本使用教程,包括如何使用Docker拉取RabbitMQ镜像、创建容器、通过浏览器访问管理界面,以及如何创建交换机、队列、绑定和使用direct、fanout和topic三种类型的交换器进行消息发布和接收的测试。
消息中间件RabbitMQ---Docker安装RabbitMQ、以及RabbitMQ的基本使用【二】
|
1月前
|
消息中间件 存储 网络协议
消息中间件RabbitMQ---概述和概念 【一】
该文章提供了对消息中间件RabbitMQ的全面概述,包括其核心概念、工作原理以及与AMQP和JMS的关系。
消息中间件RabbitMQ---概述和概念 【一】
|
2月前
|
消息中间件 监控 负载均衡
中间件RabbitMQ性能瓶颈
【7月更文挑战第13天】
147 11
|
2月前
|
消息中间件 NoSQL Kafka
消息中间件(RocketMQ、RabbitMQ、ActiveMQ、Redis、kafka、ZeroMQ)以及之间的区别
消息中间件(RocketMQ、RabbitMQ、ActiveMQ、Redis、kafka、ZeroMQ)以及之间的区别