<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 中間件 中間件是在路由處理程序 **之前** 調用的函數。 中間件函數可以訪問請求和響應對象,以及應用程序請求響應周期中的 `next()`中間件函數。`next()` 中間件函數通常由名為 `next` 的變量表示。 ![圖1](https://docs.nestjs.com/assets/Middlewares_1.png) Nest 中間件實際上等價于 [express](http://expressjs.com/en/guide/using-middleware.html) 中間件。 下面是Express官方文檔中所述的中間件功能: 中間件函數可以執行以下任務: - 執行任何代碼。 - 對請求和響應對象進行更改。 - 結束請求-響應周期。 - 調用堆棧中的下一個中間件函數。 - 如果當前的中間件函數沒有結束請求-響應周期, 它必須調用 `next()` 將控制傳遞給下一個中間件函數。否則, 請求將被掛起。 您可以在函數中或在具有 `@Injectable()` 裝飾器的類中實現自定義 `Nest`中間件。 這個類應該實現 `NestMiddleware` 接口, 而函數沒有任何特殊的要求。 讓我們首先使用類方法實現一個簡單的中間件功能。 > logger.middleware.ts ```typescript 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`中間件完全支持依賴注入。 就像提供者和控制器一樣,它們能夠**注入**屬于同一模塊的依賴項(通過 `constructor` )。 ## 應用中間件 中間件不能在 `@Module()` 裝飾器中列出。我們必須使用模塊類的 `configure()` 方法來設置它們。包含中間件的模塊必須實現 `NestModule` 接口。我們將 `LoggerMiddleware` 設置在 `ApplicationModule` 層上。 > app.module.ts ```typescript 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'); } } ``` 我們還可以在配置中間件時將包含路由路徑的對象`path`和請求方法`method`傳遞給`forRoutes()`方法。我們為之前在`CatsController`中定義的`/cats`路由處理程序設置了`LoggerMiddleware`。我們還可以在配置中間件時將包含路由路徑的對象和請求方法傳遞給 `forRoutes()`方法,從而進一步將中間件限制為特定的請求方法。在下面的示例中,請注意我們導入了 `RequestMethod`來引用所需的請求方法類型。 > app.module.ts ```typescript 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 }); } } ``` > 可以使用 `async/await`來實現 `configure()`方法的異步化(例如,可以在 `configure()`方法體中等待異步操作的完成)。 ## 路由通配符 路由同樣支持模式匹配。例如,星號被用作**通配符**,將匹配任何字符組合。 ```typescript forRoutes({ path: 'ab*cd', method: RequestMethod.ALL }); ``` 以上路由地址將匹配 `abcd` 、 `ab_cd` 、 `abecd` 等。字符 `?` 、 `+` 、 `*` 以及 `()` 是它們的正則表達式對應項的子集。連字符 (`-`) 和點 (`.`) 按字符串路徑解析。 > 該 `fastify` 軟件包使用該軟件包的最新版本,該版本 `path-to-regexp` 不再支持通配符星號*。相反,您必須使用參數(例如(`.*`),`:splat*`)。 ## 中間件消費者 `MiddlewareConsumer` 是一個幫助類。它提供了幾種內置方法來管理中間件。他們都可以被簡單地**鏈接**起來。`forRoutes()` 可接受一個字符串、多個字符串、對象、一個控制器類甚至多個控制器類。在大多數情況下,您可能只會傳遞一個由逗號分隔的控制器列表。以下是單個控制器的示例: > app.module.ts ```typescript 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.ts'; @Module({ imports: [CatsModule], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer .apply(LoggerMiddleware) .forRoutes(CatsController); } } ``` > 該 `apply()` 方法可以使用單個中間件,也可以使用多個參數來指定多個[**多個中間件**](https://docs.nestjs.com/middleware#multiple-middleware)。 ### 排除路由[#](https://docs.nestjs.com/middleware#excluding-routes) 有時我們想從應用中間件中排除某些路由。我們可以使用該 `exclude()` 方法輕松排除某些路由。此方法可以采用一個字符串,多個字符串或一個 `RouteInfo` 對象來標識要排除的路由,如下所示: ```typescript consumer .apply(LoggerMiddleware) .exclude( { path: 'cats', method: RequestMethod.GET }, { path: 'cats', method: RequestMethod.POST }, 'cats/(.*)', ) .forRoutes(CatsController); ``` > 該 `exclude()` 方法使用 `path-to-regexp` 包支持通配符參數。 在上面的示例中,`LoggerMiddleware` 將綁定到內部定義的所有路由,`CatsController` 但傳遞給 `exclude()` 方法的三個路由除外。 ## 函數式中間件 我們使用的 `LoggerMiddleware` 類非常簡單。它沒有成員,沒有額外的方法,沒有依賴關系。為什么我們不能只使用一個簡單的函數?這是一個很好的問題,因為事實上 - 我們可以做到。這種類型的中間件稱為**函數式中間件**。讓我們把 `logger` 轉換成函數中間件來說明區別: > logger.middleware.ts ```typescript export function logger(req, res, next) { console.log(`Request...`); next(); }; ``` 現在在 `AppModule` 中使用它。 > app.module.ts ```typescript consumer .apply(logger) .forRoutes(CatsController); ``` > 當您的中間件沒有任何依賴關系時,我們可以考慮使用**函數式中間件**。 ## 多個中間件 如上所述,為了綁定順序執行的多個中間件,只需在`apply()`方法內部提供一個逗號分隔的列表。 ```typescript consumer.apply(cors(), helmet(), logger).forRoutes(CatsController); ``` ## 全局中間件 如果我們想一次性將中間件綁定到每個注冊路由,我們可以使用由`INestApplication`實例提供的 `use()`方法: ```typescript const app = await NestFactory.create(AppModule); app.use(logger); await app.listen(3000); ``` > **提示**:無法訪問全局中間件中的 DI 容器。使用 `app.use() `時,您可以使用[函數式中間件](https://docs.nestjs.com/middleware#functional-middleware)。或者,您可以使用類中間件并在 AppModule(或任何其他模塊)中使用 `.forRoutes('*') `來使用它。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看