最近の文書Middleware


Middleware


Root Handlerの前で呼び出された関数.req、resオブジェクトはアクセス可能であり、next()ミドルウェア関数はrequest-responseループに含まれる

Nestミドルウェアはexpressと同じ効果を有します.
1. execute any code
2. make changes to the request and response object
3. end the request-response cycle.
4. call the next middleware function in the stack
5.ミドルウェアが終了していない場合はnext()を呼び出す必要があります.そうでなければ待機状態に入ります.
Middlewareは、NestMiddlewareを実装しているクラスまたは制約のない関数から構成されます.

クラスミドルウェア

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log('Request...');
    next();
  }
}
代表的なクラスmiddereの例
構造関数でDIを使用できます.
モジュール()レコーダはミドルウェアに書き込めません.
モジュールがNestModuleを実装している場合は、configureにミドルウェアを適用できます.
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',method: RequestMethod.GET);
  }
}
同様に、特定のパスを特定のメソッドのみに設定するか、省略する場合はすべてのメソッドとすべてのパスに適用できます.もちろんワイルドカードはサポートされています、?+*()正規表現として
configure()メソッドはasync、awaitをサポートします.
Fastinyは使えません.(.,:splat*).
MiddlewareConsumerはHelperクラス、fluent style(consumer.apply()をフィルタします.forRoute.)同じように実現する
ここでforrouteはいろいろなものを入れることができます
1つの文字列、複数の文字列、RouteInfoオブジェクト、コントローラクラス、複数のコントローラクラスを区切るだけで、すべて入れることができます.
consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
apply()も同様に、これを分割すると、複数のミドルウェアを適用することができる.
consumer
  .apply(LoggerMiddleware)
  .exclude(
    { path: 'cats', method: RequestMethod.GET },
    { path: 'cats', method: RequestMethod.POST },
    'cats/(.*)',
  )
  .forRoutes(CatsController);
同じ方法で特定のパスを除外できます.
ここで、パスはワイルドカードを区別する際にpath-to-regexpというパッケージを使用します.

きのうがたミドルウェア


何も依存しないミドルウェアでは、関数型を直接作成するのはずっと簡単です.
import { Request, Response, NextFunction } from 'express';

export function logger(req: Request, res: Response, next: NextFunction) {
  console.log(`Request...`);
  next();
};
consumer
  .apply(logger)
  .forRoutes(CatsController);
Global middlware
グローバルミドルウェアは、ルータに1回のみ適用されるグローバルミドルウェアです.
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
INSTApplicationインスタンスにappを追加します.useを利用して適用できます.
ただし、DIコンテナにアクセスできないため、機能ミドルウェアを使用したり、何の内容もない場合に使用したり、クラスMiddleware for Route("*")で任意のモジュールで使用したりすることができます.