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

一、简介

  • 中间件 - 官方文档

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

  • 也就跟前端路由守卫一样,做个访问拦截处理,但是它这个可以支持读个中间件。

二、class 中间件

  • 通过指令自动创建,也可以手动创建

    $ nest g mi logger
    

    image.png

  • 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')
        // 其他的注册方式都支持...
      }
    }
    

    image.png

四、多个中间件

  • 多个中间件,逗号隔开就行

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

    image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔特斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值