NestJS核心概念之Middleware中間件創(chuàng)建使用示例
前言
用過(guò)express與koa的同學(xué),對(duì)中間件這個(gè)概念應(yīng)該非常熟悉了,中間件可以拿到Request、Response對(duì)象和next函數(shù).
一般來(lái)講中間件有以下作用:
- 執(zhí)行任何代碼
- 對(duì)請(qǐng)求與響應(yīng)攔截并改造
- 結(jié)束
request-response周期 - 通過(guò)
next()調(diào)用下一個(gè)中間件 - 如果當(dāng)前中間件沒(méi)有結(jié)束當(dāng)前
request-response周期,必須調(diào)用next()函數(shù),否則請(qǐng)求會(huì)處于掛起狀態(tài),阻塞整個(gè)應(yīng)用
中間件一般有兩種:類中間件、函數(shù)中間件
類中間件
創(chuàng)建類中間件
使用@Injectable()裝飾器,并且需要實(shí)現(xiàn)NestMiddleware接口(use方法)
// Logger.middleware.ts
import { Injectable, NestMiddleware } from "@nestjs/common";
import { Request, Response } from "express";
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: () => void) {
console.log('logger middleware', `url: ${req.url}`);
next();
}
}使用類中間件
類中間創(chuàng)建完之后,需要在模塊中進(jìn)行掛載,但@Module裝飾器并沒(méi)有中間件的相關(guān)配置,我們需要讓module類實(shí)現(xiàn)NestModule接口,實(shí)現(xiàn)里面configure方法來(lái)進(jìn)行掛載
// user.module.ts
import { Module, NestModule } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { LoggerMiddleware } from '../middleware/Logger.middleware';
@Module({
controllers: [UserController],
providers: [UserService]
})
export class UserModule implements NestModule {
configure(consumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes(UserController);
}
}apply方法表示掛載的是哪個(gè)中間件forRoutes方法表示對(duì)哪個(gè)請(qǐng)求路徑起作用,這種方式與app.use(path, middleware)作用是一樣,只針對(duì)部分路徑起作用- 當(dāng)給
forRoutes方法傳遞的是一個(gè)controller控制器時(shí),那么該中間件則對(duì)整個(gè)控制器下的路徑生效
比如這里傳遞的是UserController控制器,那么針對(duì)該控制器下的路徑都會(huì)生效

forRootes方法還能做更詳細(xì)的配置,比如可以針對(duì)特定的請(qǐng)求方法、請(qǐng)求路徑可以使用正則匹配(需要注意的是使用fastify驅(qū)動(dòng)不能使用)
export class UserModule implements NestModule {
configure(consumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes({ path: 'user', method: RequestMethod.GET});
}
}apply可以同時(shí)掛載多個(gè)中間件
export class UserModule implements NestModule {
configure(consumer) {
consumer
.apply(LoggerMiddleware, aaaMiddleware, ...)
.forRoutes({ path: 'user', method: RequestMethod.GET});
}
}forRoutes可以使用單個(gè)string路徑,多個(gè)string路徑,RouteInfo對(duì)象,單個(gè)Controller,多個(gè)Controller
export class AppModule implements NestModule {
configure(consumer) {
consumer
.apply(LoggerMiddleware, NjMiddleware, ...)
.forRoutes(UserController, NjController, ...);
}
}exclude可以用來(lái)排除不使用中間件的路徑
export class UserModule implements NestModule {
configure(consumer) {
consumer
.apply(LoggerMiddleware)
.exclude({ path: '/user/a', method: RequestMethod.GET})
.forRoutes(UserController);
}
}需要注意的是forRoutes需要最后調(diào)用
函數(shù)中間件
這種方式較為簡(jiǎn)單,使用起來(lái)與類中間件一致
創(chuàng)建函數(shù)中間件
export function LoggerMiddleware(req: Request, res: Response, next: () => void) {
console.log('logger middleware', `url: ${req.url}`);
next();
}使用函數(shù)中間件
export class UserModule implements NestModule {
configure(consumer) {
consumer
.apply(LoggerMiddleware)
.exclude({ path: '/user/a', method: RequestMethod.GET})
.forRoutes(UserController);
}
}
全局中間件
可以直接在入口文件main.ts中使用app.use來(lái)掛載中間件,這樣掛載的中間件將全局生效
app.use(LoggerMiddleware) // 日志中間件

中間件其實(shí)可以用來(lái)實(shí)現(xiàn)很多功能,比如:日志系統(tǒng)、cors跨域處理、圖片防盜等...
對(duì)圖片防盜感興趣的可以看我這篇文章:你不知道的 HTTP Referer
以上就是NestJS核心概念之Middleware中間件創(chuàng)建使用示例的詳細(xì)內(nèi)容,更多關(guān)于NestJS Middleware中間件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Node使用Puppeteer監(jiān)聽(tīng)并打印網(wǎng)頁(yè)的接口請(qǐng)求
Puppeteer 是一個(gè) Node 庫(kù),它提供了高級(jí)的 API 來(lái)通過(guò) DevTools 協(xié)議控制 Chrome 或 Chromium,本文我們就來(lái)看看如何使用Puppeteer監(jiān)聽(tīng)并打印網(wǎng)頁(yè)的接口請(qǐng)求吧2025-04-04
Node解決簡(jiǎn)單重復(fù)問(wèn)題系列之Excel內(nèi)容的獲取
這篇文章主要給大家介紹了關(guān)于利用Node解決簡(jiǎn)單重復(fù)問(wèn)題系列之Excel內(nèi)容獲取的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧。2018-01-01
Node.js實(shí)現(xiàn)前端后端數(shù)據(jù)傳輸加密解密
這篇文章主要介紹了Node.js實(shí)現(xiàn)前端后端數(shù)據(jù)傳輸加密解密,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實(shí)現(xiàn)
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實(shí)現(xiàn),本文先是組出了代碼,然后對(duì)代碼一一分析,需要的朋友可以參考下2014-12-12
Nodejs異步回調(diào)之異常處理實(shí)例分析
這篇文章主要介紹了Nodejs異步回調(diào)之異常處理,結(jié)合實(shí)例形式分析了nodejs基于中間件進(jìn)行異步回調(diào)異常處理過(guò)程出現(xiàn)的問(wèn)題與相應(yīng)的解決方法,需要的朋友可以參考下2018-06-06
npm?i報(bào)錯(cuò)以及解決方案實(shí)戰(zhàn)案例
npm在前端開(kāi)發(fā)流程中提供了非常完善的自動(dòng)化工具鏈,但是同樣由于其復(fù)雜性導(dǎo)致有很多奇奇怪怪的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于npm?i報(bào)錯(cuò)以及解決方案的相關(guān)資料,需要的朋友可以參考下2022-07-07
使用nodejs?+?koa?+?typescript?集成和自動(dòng)重啟的問(wèn)題
這篇文章主要介紹了nodejs?+?koa?+?typescript?集成和自動(dòng)重啟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12

