首页 > 其他分享 >【NestJS系列】核心概念:Middleware中间件

【NestJS系列】核心概念:Middleware中间件

时间:2023-08-28 19:55:05浏览次数:59  
标签:Middleware 中间件 LoggerMiddleware NestJS apply export consumer forRoutes

前言

用过expresskoa的同学,对中间件这个概念应该非常熟悉了,中间件可以拿到RequestResponse对象和next函数.

一般来讲中间件有以下作用:

  • 执行任何代码
  • 对请求与响应拦截并改造
  • 结束request-response周期
  • 通过next()调用下一个中间件
  • 如果当前中间件没有结束当前request-response周期,必须调用next()函数,否则请求会处于挂起状态,阻塞整个应用

中间件一般有两种:类中间件函数中间件

类中间件

创建类中间件

使用@Injectable()装饰器,并且需要实现NestMiddleware接口(use方法)

// Logger.middleware.ts
import { Injectable, NestMiddleware } from "@nestjs/common";
import { Request, Response } from "express";

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
    use(req: Request, res: Response, next: () => void) {
        console.log('logger middleware', `url: ${req.url}`);
        next();
    }
}

使用类中间件

类中间创建完之后,需要在模块中进行挂载,但@Module装饰器并没有中间件的相关配置,我们需要让module类实现NestModule接口,实现里面configure方法来进行挂载

// user.module.ts
import { Module, NestModule } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { LoggerMiddleware } from '../middleware/Logger.middleware';
@Module({
  controllers: [UserController],
  providers: [UserService]
})
export class UserModule implements NestModule {
  configure(consumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes(UserController);
  }
}
  • apply方法表示挂载的是哪个中间件
  • forRoutes方法表示对哪个请求路径起作用,这种方式与app.use(path, middleware)作用是一样,只针对部分路径起作用
  • 当给forRoutes方法传递的是一个controller控制器时,那么该中间件则对整个控制器下的路径生效

比如这里传递的是UserController控制器,那么针对该控制器下的路径都会生效

  • forRootes方法还能做更详细的配置,比如可以针对特定的请求方法、请求路径可以使用正则匹配(需要注意的是使用fastify驱动不能使用)
export class UserModule implements NestModule {
  configure(consumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes({ path: 'user', method: RequestMethod.GET});
  }
}
  • apply可以同时挂载多个中间件
export class UserModule implements NestModule {
  configure(consumer) {
    consumer
      .apply(LoggerMiddleware, aaaMiddleware, ...)
      .forRoutes({ path: 'user', method: RequestMethod.GET});
  }
}
  • forRoutes可以使用单个string路径,多个string路径,RouteInfo对象,单个Controller,多个Controller
export class AppModule implements NestModule {
  configure(consumer) {
    consumer
      .apply(LoggerMiddleware, NjMiddleware, ...)
      .forRoutes(UserController, NjController, ...);
  }
}
  • exclude可以用来排除不使用中间件的路径
export class UserModule implements NestModule {
  configure(consumer) {
    consumer
      .apply(LoggerMiddleware)
      .exclude({ path: '/user/a', method: RequestMethod.GET})
      .forRoutes(UserController);
  }
}

需要注意的是forRoutes需要最后调用

函数中间件

这种方式较为简单,使用起来与类中间件一致

创建函数中间件

export function LoggerMiddleware(req: Request, res: Response, next: () => void) {
    console.log('logger middleware', `url: ${req.url}`);
    next();
}

使用函数中间件

export class UserModule implements NestModule {
  configure(consumer) {
    consumer
      .apply(LoggerMiddleware)
      .exclude({ path: '/user/a', method: RequestMethod.GET})
      .forRoutes(UserController);
  }
}

全局中间件

可以直接在入口文件main.ts中使用app.use来挂载中间件,这样挂载的中间件将全局生效

app.use(LoggerMiddleware) // 日志中间件

中间件其实可以用来实现很多功能,比如:日志系统、cors跨域处理、图片防盗等...

对图片防盗感兴趣的可以看我这篇文章:你不知道的 HTTP Referer

标签:Middleware,中间件,LoggerMiddleware,NestJS,apply,export,consumer,forRoutes
From: https://www.cnblogs.com/songyao666/p/17663268.html

相关文章

  • django(cookie与session、中间件、auth模块)
    一cookie与session1发展史及简介"""发展史1.网站都没有保存用户功能的需求,所有用户访问返回的结果都是一样的eg:新闻、博客、文章2.出现了一些需要保存用户信息的网站eg:淘宝、支付宝、京东解决每次访问网站都需要重复的输入......
  • .NET CORE 终端路由中间件 app.UseEndpoints
    publicvoidConfigureServices(IServiceCollectionservices){services.AddControllers();}publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.UseRouting();app.UseAuthorization();app.UseEndpoints......
  • .NET ASP.NET CORE 中间件 管道
    一、管道路由、认证、会话、缓存等等,他们都是通过管道来实现的ASP.NETCore应用一般都是使用某个框架来开发,MVC、WebAPI,建立在某个特殊的中间件之上。通过编写中间件,扩展请求管道,在ASP.NETCore上创建我们自己的WEB框架,API网关Ocelot,API网关框架。Middleware两个职责:1、选择是......
  • 测试也要了解的中间件知识
    公众号后台有同学私信问了一个问题:中间件服务,如何做好质量保障工作?日常我们的测试工作范畴,大多都是业务强相关的,比如:电商业务大多是商品、订单、库存、支付;金融业务则是存取款、清结算等。而中间件服务很多时候会被我们下意识忽略,或者说测试过程中都会涉及到这些服务组件,但不会......
  • 中间件学习 - Rabbit MQ 概念及特殊MQ实现
    RabbitMQ官方文档介绍RabbitMQ是一个消息队列组件,使用Erlang开发,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题安装使用安装Erlang(RabbitMQ基于Erlang开发)Downloads-Erlang/OTP配置Erlang环境erl-version验证安装rabbitMQDownl......
  • webman:全局中间件:记录访问日志(v1.5.7)
    一,官方文档地址:https://www.workerman.net/doc/webman/middleware.html二,php代码1,配置中间件:config/middleware.php12345678910111213141516171819<?php/** *Thisfileispartofwebman. * *LicensedunderTheMITLicense......
  • 了解ASP.NET Core中的中间件概念
    当谈到构建强大且高度可定制的Web应用程序时,ASP.NETCore是一个备受推崇的选择。其灵活性和可扩展性使开发人员能够以更有创意的方式构建应用程序,其中的中间件概念是实现这种灵活性的关键。什么是中间件?中间件是ASP.NETCore应用程序处理HTTP请求和响应的组件。它们在请求到达应用......
  • Django自定义中间件验证用户token信息
    1.新建middleware.pyfromdjango.urlsimportreversefromrest_framework.responseimportResponsefromutils.tokenimportcheck_tokenfromdjango.httpimportJsonResponse,HttpResponseRedirectfromyshop.modelsimportMyUsertry:fromdjango.utils.de......
  • Express - 中间件
    中间件编写中间件函数可以接受三个参数,req(请求),res(响应)和next(下一个中间件函数)。如果这个中间件不结束请求/响应循环,就需要调用next函数。先装载的中间件函数会被先执行,如果忘记调用next函数,会导致后装载的中间件被忽略。使用中间件应用层中间件可以使用app.use()和app.MET......
  • 中间件
    什么是中间件?中间件是一种独立的服务程序,分布式应用软件借助中间件在不同的技术之间共享资源。由于中间件技术正处于发展过程之中,因此目前尚不能对它进行精确的定义。比较流行的定义是:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资......