【Nestjs学习日记】中间件

作者:markzzw 时间:2024-2-2

线上代码:CodeSandbox

Github:zhangzewei/nest-learning-tutorial
系列阅读

  1. 【Nestjs学习日记】初识nestjs
  2. 【Nestjs学习日记】Nest Controller
  3. 【Nestjs学习日记】抛出异常
  4. 【Nestjs学习日记】Module

在 NestJS 开发中,中间件是一种强大的工具,用于处理请求和响应之间的逻辑。中间件允许我们在请求到达控制器之前或响应返回给客户端之前执行自定义的逻辑。它们可以用于处理身份验证、日志记录、错误处理等常见的任务,以及其他自定义的处理逻辑。

NestJS 提供了灵活且易于使用的中间件机制,使我们能够轻松地编写、注册和应用中间件。通过使用中间件,我们可以将一些通用的处理逻辑集中到一个地方,提高代码的可重用性和可维护性。

中间件函数可以执行以下任务:

  1. 执行任何代码。
  2. 对请求和响应对象进行更改。
  3. 结束请求-响应循环。
  4. 调用堆栈中的下一个中间件函数。
  5. 如果当前中间件函数不结束请求-响应循环,它必须调用next()将控制权传递给下一个中间件函数。否则,请求将被搁置。

创建中间件

log.middleware.ts

ts 复制代码
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(req.path, 'log something');
    next();
  }
}

当然中间件也可以是函数式的:

ts 复制代码
import { Request, Response, NextFunction } from 'express';

export function LoggerMiddleware(req: Request, res: Response, next: NextFunction) {
  console.log(req.path, 'log something');
  next();
};

使用中间件

ts 复制代码
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatModule } from './cat/cat.module';
import { LoggerMiddleware } from './middleware/log.middleware';

@Module({
  imports: [CatModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('/');
  }
}

配置路由

在对应的 Module 的类里面实现 NestModule 的 configure 函数,在 configure 里使用传入的 consumer 参数调用 apply,把中间件放入 apply,然后使用 forRoutes 配置对应的路由。

ts 复制代码
consumer
    .apply(LoggerMiddleware)
    .forRoutes({
        path: 'cats',
        method: RequestMethod.GET
    });

也可以设置多个路由配置,path 的配置可以是单独的某一个路由,也可以是正则匹配的某一个类型的路由:

ts 复制代码
consumer.apply(LoggerMiddleware).forRoutes(
  {
    path: 'app/*',
    method: RequestMethod.GET,
  },
  {
    path: 'cat',
    method: RequestMethod.GET,
  },
);

如果觉得写理由的配置比较麻烦,也可以直接将对应的 Controller 传入作为配置:

ts 复制代码
consumer.apply(LoggerMiddleware).forRoutes(AppController);

全局使用

main.ts

ts 复制代码
app.use(LoggerMiddleware);
相关推荐
楠楠子呀8 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具
weifont8 小时前
自动化抓取和上架商品:能不动手,就少动手
运维·前端·自动化
米柆8 小时前
HTML5 audio /video 完整事件监听模板
前端·html·html5
半个落月9 小时前
LangGraph.js 实战:从状态图到分支、循环、检查点与人工中断
javascript·人工智能·langchain
IT_陈寒9 小时前
Vite热更新失效?你可能也踩了这个坑
前端·人工智能·后端
程序员大阳10 小时前
副队长CSS教程(30)–CSS Grid 实战:实现复杂自适应表单布局
前端·css·自适应·grid·表单
Csvn10 小时前
微前端实现
前端
Chrischaan10 小时前
做 AI 塔罗小程序时,我为什么不让大模型自己抽牌:一次上线复盘
前端
骑着蜗牛撵大象32711 小时前
LangChain 工具调用从声明到闭环:给智能体接上真实的手脚
前端
数据掘金11 小时前
百度统计后台页面数据异常?从手动调用时机开始排查
前端