Nest 的中间件 Middleware ?
新建项目
nest new middleware-demo
创建一个中间件
nest g middleware aaa --no-spec --flat
![]()
加下打印
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
@Injectable()
export class AaaMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: () => void) {
console.log('brefore');
next();
console.log('after');
}
}
在 Module 里这样使用
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AaaMiddleware } from './aaa.middleware';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(AaaMiddleware).forRoutes('*');
}
}
跑起来看看
![]()
可以指定更精确的路由,添加几个 handler
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('hello')
getHello(): string {
console.log('hello');
return this.appService.getHello();
}
@Get('hello2')
getHello2(): string {
console.log('hello2');
return this.appService.getHello();
}
@Get('hi')
getHi(): string {
console.log('hi');
return this.appService.getHello();
}
@Get('hi1')
getHi1(): string {
console.log('hi1');
return this.appService.getHello();
}
}
module 匹配更新下
import { AaaMiddleware } from './aaa.middleware';
import {
MiddlewareConsumer,
Module,
NestModule,
RequestMethod,
} from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(AaaMiddleware)
.forRoutes({ path: 'hello/*path', method: RequestMethod.GET });
consumer
.apply(AaaMiddleware)
.forRoutes({ path: 'hi1', method: RequestMethod.GET });
}
}
![]()
Nest 为什么要把 Middleware 做成 class 呢?
为了依赖注入!
通过 @Inject 注入 AppService 到 middleware 里
import { AppService } from './app.service';
import { Inject, Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
@Injectable()
export class AaaMiddleware implements NestMiddleware {
@Inject(AppService)
private readonly appService: AppService;
use(req: Request, res: Response, next: () => void) {
console.log('brefore');
console.log('-------' + this.appService.getHello());
next();
console.log('after');
}
}
![]()
这就是 Nest 注入的依赖