Nest-Middleware 中间件

2022/10/30 NestNest-MiddlewareNest-跨域

本文介绍Nest-Middleware中间件,介绍了使用cli创建一个中间件和全局中间件的方法,并且配置跨域。

# 依赖注入的中间件

  • 使用nest-cli创建一个logger的中间件

    • nest g mi logger
    import { Injectable, NestMiddleware } from '@nestjs/common';
    import { Request, Response } from 'express';
    
    @Injectable()
    export class LoggerMiddleware implements NestMiddleware {
      use(req: Request, res: Response, next: () => void) {
        // req 请求
        // res 响应
        // next 通过
        // res 和 next 不可以同时用
        res.send('当前接口被拦截了');
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
  • 使用

    • 指定路由拦截
      import {
        MiddlewareConsumer,
        Module,
        NestModule,
        RequestMethod,
      } from '@nestjs/common';
      import { UserController } from './user.controller';
      import { UserService } from './user.service';
      import { LoggerMiddleware } from 'src/middleware/logger.middleware';
      
      @Module({
        imports: [],
        controllers: [UserController],
        providers: [UserService],
      })
      export class UserModule implements NestModule {
        // 依赖注入的中间件
        // 定义拦截器
        configure(consumer: MiddlewareConsumer): void {
          // 指定拦截的路由
          consumer.apply(LoggerMiddleware).forRoutes('auto');
        }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
    • 指定请求类型拦截
      import {
        MiddlewareConsumer,
        Module,
        NestModule,
        RequestMethod,
      } from '@nestjs/common';
      import { UserController } from './user.controller';
      import { UserService } from './user.service';
      import { LoggerMiddleware } from 'src/middleware/logger.middleware';
      
      @Module({
        imports: [],
        controllers: [UserController],
        providers: [UserService],
      })
      export class UserModule implements NestModule {
        // 依赖注入的中间件
        // 定义拦截器
        configure(consumer: MiddlewareConsumer): void {
          // 可以选择拦截的请求类型
          consumer.apply(LoggerMiddleware).forRoutes({
            path: 'auto',
            method: RequestMethod.GET,
          });
        }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
    • 拦截当前控制器所有接口
      import {
        MiddlewareConsumer,
        Module,
        NestModule,
        RequestMethod,
      } from '@nestjs/common';
      import { UserController } from './user.controller';
      import { UserService } from './user.service';
      import { LoggerMiddleware } from 'src/middleware/logger.middleware';
      
      @Module({
        imports: [],
        controllers: [UserController],
        providers: [UserService],
      })
      export class UserModule implements NestModule {
        // 依赖注入的中间件
        // 定义拦截器
        configure(consumer: MiddlewareConsumer): void {
          // 拦截当前控制器所有接口
          consumer.apply(LoggerMiddleware).forRoutes(UserController);
        }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23

# 全局中间件

全局中间件

全局中间件 必须是个函数,不可以使用类,一般作为全局白名单判断和token校验。

  • 声明
    function ModdlewareAll(req: Request, res: Response, next: () => void) {
      res.send('所有接口被拦截了 ');
      // next();
    }
    
    1
    2
    3
    4
  • 挂载必须在main.ts中挂载
    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './modules/app.module';
    import { gerLocalhost } from './utils';
    import { Request, Response } from 'express';
    
    // 全局中间件 必须是个函数,不可以使用类
    // 可以用作全局白名单判断 或者 token 判断
    function ModdlewareAll(req: Request, res: Response, next: () => void) {
      res.send('所有接口被拦截了 ');
      // next();
    }
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
    
      app.use(ModdlewareAll);
    
      await app.listen(11000);
    
      const localhost = gerLocalhost();
      console.log('\n', '🚀   Nest Starter Server\n');
      console.log(`> Local: http://localhost:${11000}`);
      console.log(`> Network: http://${localhost}:${11000}\n`);
    }
    
    bootstrap();
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

# 配置跨域

  • 安装配置跨域的包
    yarn add cors
    yarn add @types/cors
    
    1
    2
  • 配置跨域
    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './modules/app.module';
    import { gerLocalhost } from './utils';
    import * as cors from 'cors';
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
    
      app.use(cors());
    
      await app.listen(11000);
    
      const localhost = gerLocalhost();
      console.log('\n', '🚀   Nest Starter Server\n');
      console.log(`> Local: http://localhost:${11000}`);
      console.log(`> Network: http://${localhost}:${11000}\n`);
    }
    
    bootstrap();
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
最后更新时间: 2022/11/29 11:19:52