最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js使用Middleware中間件教程詳解

 更新時(shí)間:2023年04月14日 08:59:09   作者:zhouxiaoxiao2015  
中間件(Middleware),特指業(yè)務(wù)流程的中間處理環(huán)節(jié),Express中間件的調(diào)用流程-當(dāng)一個(gè)請(qǐng)求處理時(shí),可以連續(xù)調(diào)用多個(gè)中間件,從而對(duì)這次請(qǐng)求進(jìn)行預(yù)處理

中間件

中間件是一個(gè)在路由處理程序之前被調(diào)用的函數(shù)。中間件函數(shù)可以訪問(wèn)請(qǐng)求和響應(yīng)對(duì)象,以及應(yīng)用程序的請(qǐng)求-響應(yīng)周期中的next()中間件函數(shù)。下一個(gè)中間件函數(shù)通常由一個(gè)名為next的變量來(lái)表示。

Nest 中間件在默認(rèn)情況下等同于Express中間件。下面是來(lái)自官方 express 文檔的描述,描述了中間件的能力。

中間件函數(shù)可以執(zhí)行以下任務(wù):
1、執(zhí)行任何代碼。
2、對(duì)請(qǐng)求和響應(yīng)對(duì)象進(jìn)行更改。
3、結(jié)束請(qǐng)求-響應(yīng)周期。
4、調(diào)用堆棧中的下一個(gè)中間件函數(shù)。
5、如果當(dāng)前中間件函數(shù)沒(méi)有結(jié)束請(qǐng)求-響應(yīng)周期,則必須調(diào)用`next()`將控制權(quán)傳遞給下一個(gè)中間件函數(shù)。
   否則,請(qǐng)求將保持掛起狀態(tài)。

你可以在一個(gè)函數(shù)中實(shí)現(xiàn)自定義 Nest 中間件,或者在一個(gè)帶有@Injectable()裝飾器的類(lèi)中實(shí)現(xiàn)。類(lèi)應(yīng)該實(shí)現(xiàn)NestMiddleware接口,而函數(shù)則沒(méi)有任何特殊要求。讓我們先用類(lèi)的方法實(shí)現(xiàn)一個(gè)簡(jiǎn)單的中間件功能。

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 中間件完全支持依賴性注入。就像提供者和控制器一樣,它們能夠注入同一模塊內(nèi)可用的依賴關(guān)系。像往常一樣,這是通過(guò)構(gòu)造函數(shù)完成的。

應(yīng)用中間件

@Module()裝飾器中沒(méi)有中間件的參數(shù)位置。所以,我們使用模塊類(lèi)的configure()方法來(lái)設(shè)置它們。包含中間件的模塊必須實(shí)現(xiàn)NestModule接口。讓我們?cè)?code>AppModule級(jí)別設(shè)置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");
  }
}

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

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 進(jìn)行異步操作(例如,你可以在 configure()方法主體內(nèi)等待一個(gè)異步操作的完成)

警告

當(dāng)使用Express適配器時(shí),NestJS應(yīng)用程序?qū)⒛J(rèn)從包的body-parser注冊(cè) json 和 urlencoded。這意味著如果你想通過(guò)MiddlewareConsumer定制該中間件,你需要在用NestFactory.create()創(chuàng)建應(yīng)用程序時(shí)將bodyParser標(biāo)志設(shè)置為false,從而關(guān)閉全局中間件。

路由通配符

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

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

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

中間件消費(fèi)者

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

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() 方法可以使用單個(gè)中間件,也可以使用多個(gè)參數(shù)來(lái)指定多個(gè)多個(gè)中間件。

路由排除

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

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

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

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

函數(shù)式中間件

我們一直在使用的LoggerMiddleware類(lèi)非常簡(jiǎn)單。它沒(méi)有成員,沒(méi)有其他方法,也沒(méi)有依賴項(xiàng)。為什么我們不能在一個(gè)簡(jiǎn)單的函數(shù)而不是類(lèi)中定義它?事實(shí)上,我們可以。這種類(lèi)型的中間件稱為函數(shù)式間件。讓我們將LoggerMiddleware中間件從基于類(lèi)的中間件轉(zhuǎn)換為函數(shù)式間件,以說(shuō)明其中的區(qū)別:

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);

只要中間件不需要任何依賴項(xiàng),請(qǐng)考慮使用更簡(jiǎn)單的 函數(shù)式中間件 替代方法。

多個(gè)中間件

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

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

全局中間件

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

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

無(wú)法訪問(wèn)全局中間件中的 DI 容器。當(dāng)使用app.use() 時(shí),您可以使用[函數(shù)式中間件](中間件#functional-middleware)代替?;蛘?,您可以使用類(lèi)中間件并將其與AppModule或任何其他模塊)中的.forRoutes(”*“)一起使用。

到此這篇關(guān)于Node.js使用Middleware中間件教程詳解的文章就介紹到這了,更多相關(guān)Node.js Middleware內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Node.js中文件操作模塊File System的詳細(xì)介紹

    Node.js中文件操作模塊File System的詳細(xì)介紹

    FileSystem模塊是類(lèi)似UNIX(POSIX)標(biāo)準(zhǔn)的文件操作API,用于操作文件系統(tǒng)——讀寫(xiě)目錄、讀寫(xiě)文件——Node.js底層使用C程序來(lái)實(shí)現(xiàn),這些功能是客戶端JS所不具備的。下面這篇文章就給大家詳細(xì)介紹了Node.js中的文件操作模塊File System,有需要的朋友們可以參考借鑒。
    2017-01-01
  • node.js應(yīng)用后臺(tái)守護(hù)進(jìn)程管理器Forever安裝和使用實(shí)例

    node.js應(yīng)用后臺(tái)守護(hù)進(jìn)程管理器Forever安裝和使用實(shí)例

    這篇文章主要介紹了node.js應(yīng)用后臺(tái)守護(hù)進(jìn)程管理器Forever安裝和使用實(shí)例,forever可以看做是一個(gè)nodejs的守護(hù)進(jìn)程,能夠啟動(dòng),停止,重啟我們的app應(yīng)用,需要的朋友可以參考下
    2014-06-06
  • DevEco?Studio設(shè)置Nodejs提示路徑只能包含英文、數(shù)字、下劃線等解決辦法

    DevEco?Studio設(shè)置Nodejs提示路徑只能包含英文、數(shù)字、下劃線等解決辦法

    這篇文章主要給大家介紹了關(guān)于DevEco?Studio設(shè)置Nodejs提示路徑只能包含英文、數(shù)字、下劃線等的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • nodejs個(gè)人博客開(kāi)發(fā)第四步 數(shù)據(jù)模型

    nodejs個(gè)人博客開(kāi)發(fā)第四步 數(shù)據(jù)模型

    這篇文章主要為大家詳細(xì)介紹了nodejs個(gè)人博客開(kāi)發(fā)的數(shù)據(jù)模型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 淺談node中的cluster集群

    淺談node中的cluster集群

    這篇文章主要介紹了淺談node中的cluster集群,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 詳解Nodejs基于mongoose模塊的增刪改查的操作

    詳解Nodejs基于mongoose模塊的增刪改查的操作

    本篇文章主要介紹了Nodejs基于mongoose模塊的增刪改查的操作,Mongoose是MongoDB的一個(gè)對(duì)象模型工具,封裝了MongoDB對(duì)文檔的的一些增刪改查等常用方法,讓NodeJS操作Mongodb數(shù)據(jù)庫(kù)變得更加靈活簡(jiǎn)單。
    2016-12-12
  • node.js中的fs.exists方法使用說(shuō)明

    node.js中的fs.exists方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.exists方法使用說(shuō)明,本文介紹了fs.exists方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js中MongoDB插入數(shù)據(jù)的實(shí)現(xiàn)方法

    Node.js中MongoDB插入數(shù)據(jù)的實(shí)現(xiàn)方法

    在Node.js中,可以使用MongoDB原生驅(qū)動(dòng)或Mongoose庫(kù)來(lái)連接和操作MongoDB數(shù)據(jù)庫(kù),本文就來(lái)介紹一下Node.js中MongoDB插入數(shù)據(jù)的實(shí)現(xiàn)方法,感興趣的可以了解一下
    2023-12-12
  • npm報(bào)錯(cuò)"A?complete?log?of?this?run?can?be?found?in:"的解決辦法

    npm報(bào)錯(cuò)"A?complete?log?of?this?run?can?be?found?

    這篇文章主要給大家介紹了關(guān)于npm報(bào)錯(cuò)"A?complete?log?of?this?run?can?be?found?in:"的解決辦法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 我的NodeJs學(xué)習(xí)小結(jié)(一)

    我的NodeJs學(xué)習(xí)小結(jié)(一)

    既然是我的技術(shù)總結(jié),那就是以我的技術(shù)水平為基礎(chǔ)的,寫(xiě)淺了大家不要笑話,如果有錯(cuò)誤的地方還望指正。
    2014-07-07

最新評(píng)論

浦江县| 湟中县| 云安县| 龙游县| 南江县| 隆子县| 永吉县| 辉南县| 阿鲁科尔沁旗| 东港市| 射洪县| 九寨沟县| 贵南县| 大新县| 平邑县| 田东县| 丹棱县| 镇平县| 特克斯县| 克什克腾旗| 武隆县| 云浮市| 杭锦后旗| 额尔古纳市| 斗六市| 右玉县| 道孚县| 敖汉旗| 舟曲县| 广安市| 融水| 江门市| 秦皇岛市| 东莞市| 安溪县| 安岳县| 大兴区| 饶河县| 岑巩县| 天水市| 合江县|