Nestjs(四)中间件常见使用方式(class、函数中间件)

简介: Nestjs(四)中间件常见使用方式(class、函数中间件)

一、简介

  • 中间件 - 官方文档
  • 中间件是在路由处理程序 之前 调用的函数。 中间件函数可以访问请求和响应对象,以及应用程序请求响应周期中的 next() 中间件函数。next() 中间件函数通常由名为 next 的变量表示。
  • 也就跟前端路由守卫一样,做个访问拦截处理,但是它这个可以支持读个中间件。

二、class 中间件

  • 通过指令自动创建,也可以手动创建
$ nest g mi logger
  • module.ts 文件中进行注册中间件,在 app.module.ts 中举例,如果想在其他 module.ts 中也同理。
import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { LoggerMiddleware } from './logger.middleware';
import { LoginModule } from './login/login.module';
import { LoginController } from './login/login.controller';
@Module({
  imports: [UserModule, LoginModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    // 监听 login 访问
    consumer.apply(LoggerMiddleware).forRoutes('login')
    // 监听 login 访问
    // consumer.apply(LoggerMiddleware).forRoutes('/login')
    // 监听 LoginController 中所有路由访问
    // consumer.apply(LoggerMiddleware).forRoutes(LoginController)
    // 监听指定路由 /user/dzm 访问
    // consumer.apply(LoggerMiddleware).forRoutes({ path: '/user/dzm', method: RequestMethod.GET })
    // 监听 LoginController 中所有路由访问,并过滤掉 /login 不进行监听,只监听其他路由访问
    // consumer.apply(LoggerMiddleware).exclude('/login').forRoutes(LoginController)
    // 这种就是过滤掉 /user/123 这种路由,路由参数是可变的这种
    // consumer.apply(LoggerMiddleware).exclude('/user/(.*)').forRoutes(UserController)
  }
}

三、函数中间件

  • 文件可以手动创建,也可以通过指令创建
import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log('调用了拦截1')
    next();
  }
}
// 函数中间件,直接导出这个使用注册即可
export function logger(req, res, next) {
  console.log('调用了拦截2');
  next();
};
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { logger } from './logger.middleware';
import { LoginModule } from './login/login.module';
@Module({
  imports: [UserModule, LoginModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    // 监听 login 访问,注册 logger 中间件
    consumer.apply(logger).forRoutes('login')
    // 其他的注册方式都支持...
  }
}

四、多个中间件

  • 多个中间件,逗号隔开就行
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { LoggerMiddleware, logger } from './logger.middleware';
import { LoginModule } from './login/login.module';
@Module({
  imports: [UserModule, LoginModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    // 监听 login 访问
    consumer.apply(LoggerMiddleware, logger).forRoutes('login')
  }
}

五、全局中间件

  • 全局中间件只需要在 main.ts 中注册即可,而且只支持函数中间件。
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { LoggerMiddleware, logger } from './logger.middleware';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // ❎ 这里不能用 class 中间件
  // app.use(LoggerMiddleware)
  // ✅ 全局中间件只能使用 函数中间件
  app.use(logger)
  await app.listen(3000);
}
bootstrap();
相关文章
|
5月前
|
JavaScript 中间件
中间件函数
【5月更文挑战第18天】
35 3
|
5月前
|
JavaScript 中间件 API
中间件使用异步函数
【5月更文挑战第16天】中间件使用异步函数
35 4
|
前端开发 中间件
[Nestjs] 中间件拦截机制
在NestJS中,中间件拦截机制提供了一种在请求和响应之间对请求进行拦截、修改或中断的方式。中间件拦截器可以用于执行通用的处理逻辑、路由守卫、身份验证、日志记录等操作。
191 0
|
中间件
小满nestjs(第十二章 nestjs 中间件)
中间件是在路由处理程序 之前 调用的函数。 中间件函数可以访问请求和响应对象
220 0
小满nestjs(第十二章 nestjs 中间件)
|
5月前
|
消息中间件 存储 负载均衡
消息中间件的选择:RabbitMQ是一个明智的选择
消息中间件的选择:RabbitMQ是一个明智的选择
89 0
|
4月前
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
444 0
|
3月前
|
消息中间件 编解码 Docker
Docker部署RabbitMQ消息中间件
【7月更文挑战第4天】Docker部署RabbitMQ消息中间件
239 3
|
2月前
|
消息中间件 Java 测试技术
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】
这篇文章是关于如何在SpringBoot应用中整合RabbitMQ的消息中间件。内容包括了在SpringBoot项目中添加RabbitMQ的依赖、配置文件设置、启动类注解,以及如何通过单元测试来创建交换器、队列、绑定,并发送和接收消息。文章还介绍了如何配置消息转换器以支持对象的序列化和反序列化,以及如何使用注解`@RabbitListener`来接收消息。
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】
|
2月前
|
消息中间件 Docker 容器
消息中间件RabbitMQ---Docker安装RabbitMQ、以及RabbitMQ的基本使用【二】
这篇文章提供了RabbitMQ的安装和基本使用教程,包括如何使用Docker拉取RabbitMQ镜像、创建容器、通过浏览器访问管理界面,以及如何创建交换机、队列、绑定和使用direct、fanout和topic三种类型的交换器进行消息发布和接收的测试。
消息中间件RabbitMQ---Docker安装RabbitMQ、以及RabbitMQ的基本使用【二】
|
2月前
|
消息中间件 存储 网络协议
消息中间件RabbitMQ---概述和概念 【一】
该文章提供了对消息中间件RabbitMQ的全面概述,包括其核心概念、工作原理以及与AMQP和JMS的关系。
消息中间件RabbitMQ---概述和概念 【一】