最近の文書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("*")で任意のモジュールで使用したりすることができます.
Reference
この問題について(最近の文書Middleware), 我々は、より多くの情報をここで見つけました
https://velog.io/@presentsong/Nest-공식문서-Middleware
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log('Request...');
next();
}
}
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);
}
}
consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
.forRoutes(CatsController);
import { Request, Response, NextFunction } from 'express';
export function logger(req: Request, res: Response, next: NextFunction) {
console.log(`Request...`);
next();
};
consumer
.apply(logger)
.forRoutes(CatsController);
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
Reference
この問題について(最近の文書Middleware), 我々は、より多くの情報をここで見つけました https://velog.io/@presentsong/Nest-공식문서-Middlewareテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol