亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js怎么使用Middleware中間件

發布時間:2023-04-15 16:17:44 來源:億速云 閱讀:98 作者:iii 欄目:開發技術

今天小編給大家分享一下Node.js怎么使用Middleware中間件的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

中間件

中間件是一個在路由處理程序之前被調用的函數。中間件函數可以訪問請求和響應對象,以及應用程序的請求-響應周期中的next()中間件函數。下一個中間件函數通常由一個名為next的變量來表示。

Node.js怎么使用Middleware中間件

Nest 中間件在默認情況下等同于Express中間件。下面是來自官方 express 文檔的描述,描述了中間件的能力。

中間件函數可以執行以下任務:
1、執行任何代碼。
2、對請求和響應對象進行更改。
3、結束請求-響應周期。
4、調用堆棧中的下一個中間件函數。
5、如果當前中間件函數沒有結束請求-響應周期,則必須調用`next()`將控制權傳遞給下一個中間件函數。
   否則,請求將保持掛起狀態。

你可以在一個函數中實現自定義 Nest 中間件,或者在一個帶有@Injectable()裝飾器的類中實現。類應該實現NestMiddleware接口,而函數則沒有任何特殊要求。讓我們先用類的方法實現一個簡單的中間件功能。

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("Request...");
    next();
  }
}

依賴注入

Nest 中間件完全支持依賴性注入。就像提供者和控制器一樣,它們能夠注入同一模塊內可用的依賴關系。像往常一樣,這是通過構造函數完成的。

應用中間件

@Module()裝飾器中沒有中間件的參數位置。所以,我們使用模塊類的configure()方法來設置它們。包含中間件的模塊必須實現NestModule接口。讓我們在AppModule級別設置LoggerMiddleware

import { Module, NestModule, MiddlewareConsumer } from "@nestjs/common";
import { LoggerMiddleware } from "./common/middleware/logger.middleware";
import { CatsModule } from "./cats/cats.module";
@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes("cats");
  }
}

在上面的例子中,我們已經為之前在CatsController中定義的/cats路由處理程序設置了LoggerMiddleware。在配置中間件時,我們還可以通過向forRoutes()方法傳遞一個包含路由路徑和請求方法的對象來進一步將中間件限制在一個特定的請求方法上。在下面的例子中,注意到我們導入了RequestMethod枚舉來引用所需的請求方法類型。

import {
  Module,
  NestModule,
  RequestMethod,
  MiddlewareConsumer,
} from "@nestjs/common";
import { LoggerMiddleware } from "./common/middleware/logger.middleware";
import { CatsModule } from "./cats/cats.module";
@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes({ path: "cats", method: RequestMethod.GET });
  }
}

configure()方法可以使用 async/await 進行異步操作(例如,你可以在 configure()方法主體內等待一個異步操作的完成)

警告

當使用Express適配器時,NestJS應用程序將默認從包的body-parser注冊 json 和 urlencoded。這意味著如果你想通過MiddlewareConsumer定制該中間件,你需要在用NestFactory.create()創建應用程序時將bodyParser標志設置為false,從而關閉全局中間件。

路由通配符

也支持基于模式的路由。例如,星號被用作通配符,將匹配任何字符的組合:

forRoutes({ path: "ab*cd", method: RequestMethod.ALL });

'ab*cd' 路由路徑將匹配 abcd、ab_cd、abecd,等等。字符"?“、”+“、”*“和”()"可以在路徑中使用,它們是對應于正則表達式的子集。連字符(-)和點(.)可以通過基于字符串的路徑進行字面解釋。

中間件消費者

MiddlewareConsumer是一個輔助類。它提供了幾種內置方法來管理中間件。所有這些都可以簡單地以Fluent styple。forRoutes()方法可以采用單個字符串、多個字符串、RouteInfo對象、一個控制器類甚至多個控制器類。在大多數情況下,你可能只會傳遞一個以逗號分隔的控制器列表。下面是單個控制器的示例:

import { Module, NestModule, MiddlewareConsumer } from "@nestjs/common";
import { LoggerMiddleware } from "./common/middleware/logger.middleware";
import { CatsModule } from "./cats/cats.module";
import { CatsController } from "./cats/cats.controller";
@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes(CatsController);
  }
}

apply() 方法可以使用單個中間件,也可以使用多個參數來指定多個多個中間件。

路由排除

有時我們希望從應用中間件中排除某些路由。我們可以使用 exclude() 方法輕松排除某些路由。此方法可以采用單個字符串、多個字符串或標識要排除的路由的 RouteInfo 對象,如下所示:

consumer
  .apply(LoggerMiddleware)
  .exclude(
    { path: "cats", method: RequestMethod.GET },
    { path: "cats", method: RequestMethod.POST },
    "cats/(.*)"
  )
  .forRoutes(CatsController);

exclude() 方法支持使用正則表達式包路徑的通配符參數。

在上面的例子中,LoggerMiddleware將被綁定到 CatsController 中定義的所有路由,除了傳遞給 exclude() 方法的三個路由。

函數式中間件

我們一直在使用的LoggerMiddleware類非常簡單。它沒有成員,沒有其他方法,也沒有依賴項。為什么我們不能在一個簡單的函數而不是類中定義它?事實上,我們可以。這種類型的中間件稱為函數式間件。讓我們將LoggerMiddleware中間件從基于類的中間件轉換為函數式間件,以說明其中的區別:

import { Request, Response, NextFunction } from "express";
export function logger(req: Request, res: Response, next: NextFunction) {
  console.log(`Request...`);
  next();
}

AppModule中使用它:

consumer.apply(logger).forRoutes(CatsController);

只要中間件不需要任何依賴項,請考慮使用更簡單的 函數式中間件 替代方法。

多個中間件

如上所述,為了綁定多個按順序執行的中間件,只需在 ‘apply()’ 方法中提供一個逗號分隔的列表:

consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);

全局中間件

如果我們想一次將中間件綁定到每個注冊的路由,我們可以使用INestApplication 實例提供的 use()方法:

const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);

無法訪問全局中間件中的 DI 容器。當使用app.use() 時,您可以使用[函數式中間件](中間件#functional-middleware)代替。或者,您可以使用類中間件并將其與AppModule或任何其他模塊)中的.forRoutes(”*“)一起使用。

以上就是“Node.js怎么使用Middleware中間件”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平武县| 铁岭县| 原平市| 陆河县| 阜康市| 兴仁县| 临沧市| 甘孜县| 沾益县| 夏津县| 屯门区| 腾冲县| 兴和县| 永宁县| 萍乡市| 武清区| 都昌县| 凤冈县| 临西县| 民县| 三原县| 高邮市| 金川县| 竹北市| 天台县| 宁化县| 邹平县| 大悟县| 安陆市| 衡南县| 固镇县| 佳木斯市| 蒙阴县| 东阿县| 迁西县| 通辽市| 姚安县| 册亨县| 上虞市| 磴口县| 张家界市|