【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);
相关推荐
Access开发易登软件几秒前
在 Access 中实现 Web 风格 To Do List
前端·数据结构·microsoft·list·vba·access·access开发
小李云雾2 分钟前
Python Web 路由详解:核心知识点全覆盖
开发语言·前端·python·路由
cd ~/Homestead3 分钟前
Vue 配置跨域的两种方法
前端·javascript·vue.js
Moment4 分钟前
AI 全栈时代,为什么推荐 NodeJs 服务端使用 NestJs
前端·javascript·后端
Moment6 分钟前
AI全栈入门指南:什么是 NestJs
前端·javascript·后端
happymaker06268 分钟前
Vue自定义指令、插槽、路由的简单使用
前端·javascript·vue.js
fengci.10 分钟前
ctfshow黑盒测试后半部分
前端
小鹿软件办公13 分钟前
谷歌 Chrome 终于推出垂直标签页与更智能的阅读模式
前端·chrome
薛定猫AI14 分钟前
【技术干货】DeepSeek 新模型实测:多模态 Web 生成能力与工程落地评估
前端
AIBox36515 分钟前
codex api 配置教程:安装、鉴权、Windows 环境变量
javascript·人工智能·windows·gpt