【Nest】中间件

news/2025/3/6 17:37:11/

一、中间件的创建与使用

1. 中间件

通过实现 NestMiddleware 接口创建类中间件,需定义 use 方法:

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(`[${new Date().toISOString()}] Request to: ${req.path}`);next(); // 必须调用 next() 传递请求}
}

注册方式:在模块中通过 MiddlewareConsumer 配置作用范围:

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';@Module({})
export class AppModule implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(LoggerMiddleware).forRoutes('*'); // 应用到所有路由,或指定控制器/路径// 可以指定路由路径方法 或者 某个控制器类// forRoutes({path:'user',method:RequestMethod.GET})// forRoutes(UserController)}
}

2. 函数中间件

更轻量的方式,直接定义函数:

export function logger(req: Request, res: Response, next: NextFunction) {console.log(`Request URL: ${req.url}`);next();
}

注册方式与类中间件相同。


二、全局中间件

全局中间件对所有路由生效,但仅支持函数形式。需在 main.ts 中配置:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as cors from 'cors';async function bootstrap() {const app = await NestFactory.create(AppModule);// 应用全局中间件app.use(LoggerMiddleware); await app.listen(3000);
}
bootstrap();

注意:类中间件若需全局生效,需在模块中配置 forRoutes('*')


三、使用第三方中间件(以 CORS 为例)

npm install corsnpm install @types/cors -D

1. 通过 NestJS 内置模块

main.ts 中启用:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';async function bootstrap() {const app = await NestFactory.create(AppModule);// 配置 CORSapp.enableCors({origin: 'http://localhost:3000', // 允许的域名methods: 'GET,POST',            // 允许的请求方法});await app.listen(3000);
}
bootstrap();

2. 直接使用 Express 中间件

例如使用 cors 包:

import * as cors from 'cors';async function bootstrap() {const app = await NestFactory.create(AppModule);app.use(cors()); // 应用第三方中间件await app.listen(3000);
}

此方式更灵活,支持原生 Express 中间件的所有配置项。


四、高级用法示例

1. 多个中间件链式调用

consumer.apply(Middleware1, Middleware2).forRoutes(UserController);

中间件按顺序执行,若某个中间件未调用 next(),后续中间件和路由处理将终止。

2. 动态中间件配置

通过工厂函数传递参数:

// 定义中间件生成函数
export function rateLimiter(options) {return (req, res, next) => {// 根据 options 实现限速逻辑next();};
}// 注册时传入参数
consumer.apply(rateLimiter({ windowMs: 15000, max: 100 })).forRoutes('*');

总结

类型适用场景特点
中间件复杂逻辑、依赖注入支持模块化配置,可复用性高
函数中间件简单逻辑、快速实现无需类结构,轻量级
全局中间件跨路由统一处理(如日志)仅函数形式,需在入口文件配置
第三方中间件跨域、限速等通用功能直接复用 Express 生态

http://www.ppmy.cn/news/1577124.html

相关文章

QDBus:Qt对DBus的封装支持

QDBus:Qt对DBus的封装支持 引言 在Qt应用程序开发中,进程间通信(IPC)是实现模块化、服务化和分布式架构的关键技术。QDBus是Qt框架对DBus(Desktop Bus)协议的封装,为开发者提供了一种高效、便捷…

The Rust Programming Language 学习 (二)

通用编程概念 变量和可变性 默认情况下变量是不可变的(immutable),不过你也可以选择让变量是可变的(mutable). 变量的遮蔽 你可以声明和前面变量具有相同名称的新变量,说这个是第一个变量被第二个变量遮蔽(shadow&…

Java TCP 通信:实现简单的 Echo 服务器与客户端

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。与 UDP 不同,TCP 保证了数据的顺序、可靠性和完整性,适用于需要可靠传输的应用场景,如文件传输、网页浏览等。本文将基于 Java 实现一个简单的…

【GB28181】 SIP信令服务器

概述 本文仅总结关于GB28181下的注册、心跳维持等与推流拉流相配合的SIP信令,主要基于eXosip库实现;其中搭建信令服务器参考了开源代码以及B站up北小菜,文章结尾有链接 主要逻辑梳理 配置自身SIP服务器,同时配置自己想要访问的SI…

6.从零开始学会Vue--{{路由}}

1.路由简介 Vue 作为一个渐进式框架,在使用 vue-router 之后可以是程序变为一个 SPA 的单页面应用, 它的本质是使用了 js 的 History API: Vue Router 利用浏览器的 History API(如 pushState 和 replaceState),实现…

自学微信小程序的第八天

DAY8 1、使用动画API即可完成动画效果的制作,先通过wx.createAnimation()方法获取Animation实例,然后调用Animation实例的方法实现动画效果。 表40:wx.createAnimation()方法的常用选项 选项 类型 说明 duration number 动画持续时间,单位为毫秒,默认值为400毫秒 timing…

【计算机视觉】手势识别

手势识别是计算机视觉领域中的重要方向,通过对摄像机采集的手部相关的图像序列进行分析处理,进而识别其中的手势,手势被识别后用户就可以通过手势来控制设备或者与设备交互。完整的手势识别一般有手的检测和姿态估计、手部跟踪和手势识别等。…

HTTP四次挥手是什么?

四次挥手,这是TCP协议用来关闭连接的过程。四次挥手是确保两个主机之间能够安全、可靠地关闭连接的重要机制。我会用简单易懂的方式来讲解,帮助你理解它的原理和过程。 1. 什么是四次挥手? 定义 四次挥手是TCP协议用来关闭连接的过程。它通…