【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);
相关推荐
NoneCoder6 分钟前
JavaScript系列(43)--依赖注入系统实现详解
开发语言·javascript·ecmascript
大叔是90后大叔30 分钟前
el-dialog内容大于高度时可滑动
javascript·vue.js·elementui
拿我格子衫来2 小时前
图形编辑器基于Paper.js教程22:在图形矢量编辑器中,实现两个元素的差集,交集,并集,切割
前端·javascript·图像处理·编辑器·图形渲染
哟哟耶耶2 小时前
css-background-color(transparent)
前端·css
不做超级小白2 小时前
深入理解 JavaScript 对象字面量:创建对象的简洁方法
开发语言·javascript·ecmascript
朝阳392 小时前
JS 正则表达式 -- 分组【详解】含普通分组、命名分组、反向引用
前端·javascript·正则表达式
Cool----代购系统API3 小时前
css设置盒子动画,CSS3 transition动画 animation动画
前端·css·css3
哟哟耶耶3 小时前
css-设置元素的溢出行为为可见overflow: visible;
前端·css
sunly_3 小时前
CSS:跑马灯
前端·css