【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);
相关推荐
怒放的生命19915 分钟前
本地用 pnpm 省磁盘,团队继续用 npm:极简实践
前端·npm·node.js
用户1179536547817 分钟前
企业团队编程软件怎么选:AI编程工具的协作与落地能力对比
javascript
believed_breadfruit22 分钟前
我开源了一个HTML 分页导出工具,解决了复杂页面的内容截断、跨页错乱和长文档白屏问题
前端·javascript·github
福狼27 分钟前
从“网墙”到柔性曲面:一次 WebGPU 波浪的逆向分析与重建
前端·逆向
宝哥聊编程35 分钟前
主流 Agent 平台对比:Coze、Dify、飞书、扣子、OpenClaw 落地实操手册
前端·人工智能·飞书
时间的情敌1 小时前
Vue3 + Cesium 实战:本地上传 GLB 模型、模型上叠加 GLB、点击控制透明度
前端·vue.js·cesium
拖孩1 小时前
流量主门槛从 500 降到 100,我的小程序上线 18 小时够到了线
前端·后端·微信小程序
深蓝AI1 小时前
编码 Agent 的界面味靠提示词压不住:Impeccable 用无模型规则拦同一套模板
前端·程序员
CCIE-Yasuo1 小时前
网络安全-Javascript基础
javascript·安全·web安全
January12072 小时前
【AI方法笔记】2026-11-02:模型流式吐 JSON 时,前端会遇到四种崩法
前端·人工智能·笔记·json