NestJS核心概念之Middleware中间件创建使用示例

 更新时间:2023年08月29日 09:17:50   作者:南玖  
这篇文章主要为大家介绍了NestJS核心概念之Middleware中间件创建使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

用过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

以上就是NestJS核心概念之Middleware中间件创建使用示例的详细内容,更多关于NestJS Middleware中间件的资料请关注脚本之家其它相关文章!

相关文章

  • NodeJS使用七牛云存储上传文件的方法

    NodeJS使用七牛云存储上传文件的方法

    这篇文章主要介绍了NodeJS使用七牛云存储上传文件的方法,使用七牛云存储上传文件确认安装node和npm,具体服务器端的云存储操作方法大家参考下本文吧
    2017-07-07
  • node.js增删改查保姆级教程方法

    node.js增删改查保姆级教程方法

    这篇文章主要给大家介绍了关于node.js增删改查保姆级教程的相关资料,node.js接口可以实现增加、删除、修改和查询操作,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Nuxt配合Node在实际生产中的应用详解

    Nuxt配合Node在实际生产中的应用详解

    这篇文章主要介绍了Nuxt配合Node在实际生产中的应用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 浅谈node.js 命令行工具(cli)

    浅谈node.js 命令行工具(cli)

    nodejs开发命令行工具,流程相对简单,但一套完整的命令行程序开发流程下来,还是需要下点功夫,这篇文章主要介绍了浅谈node.js 命令行工具(cli),感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Express.JS使用详解

    Express.JS使用详解

    Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用。下面我们将逐步分析下,各位不要轻易离开
    2014-07-07
  • Vue+Node实现的商城用户管理功能示例

    Vue+Node实现的商城用户管理功能示例

    这篇文章主要介绍了Vue+Node实现的商城用户管理功能,结合实例形式详细分析了商城用户管理的前台登录、校验、跳转、退出等相关操作技巧,需要的朋友可以参考下
    2019-12-12
  • 如何在Nestjs和Vue3中使用socket.io示例详解

    如何在Nestjs和Vue3中使用socket.io示例详解

    这篇文章主要为大家介绍了如何在Nestjs和Vue3中使用socket.io示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • nodejs语言实现验证码生成功能的示例代码

    nodejs语言实现验证码生成功能的示例代码

    这篇文章主要介绍了nodejs语言实现验证码生成功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Node.js中创建和管理外部进程详解

    Node.js中创建和管理外部进程详解

    这篇文章主要介绍了Node.js中创建和管理外部进程详解,本文讲解了执行外部命令的方法、子进程相关内容等,需要的朋友可以参考下
    2014-08-08
  • node实现生成带参数的小程序二维码并保存到本地功能示例

    node实现生成带参数的小程序二维码并保存到本地功能示例

    这篇文章主要介绍了node实现生成带参数的小程序二维码并保存到本地功能,涉及nodejs模块引用、接口调用、编码转换、图片生成等相关操作技巧,需要的朋友可以参考下
    2018-12-12

最新评论