在上一章我们了解到Nest 并不直接依赖Express 可以切换到别的http 请求处理库
创建项目:
nest new middleware-test -p npm
创建 middleware :
nest g middleware test --no-spec --flat
这时候可以看到 req 和 res 的类型都是为 any类型 所以并不知道使用的是express 还是 fastify,所以我们需要手动标注一下类型:
下面是express 的类型标注:
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';@Injectable()
export class TestMiddleware implements NestMiddleware {use(req: Request, res: Response, next: () => void) {console.log('进入 TestMiddleware');next();console.log('结束 TestMiddleware');}
}
接着在 app.module.ts 使用:
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TestMiddleware } from './test.middleware';@Module({imports: [],controllers: [AppController],providers: [AppService],
})
export class AppModule implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(TestMiddleware).forRoutes('*')}
}
这样调用接口的时候就会使用到TestMiddleware 。
接着我们浏览器访问 http://localhost:3000
当然我们也可以指定一些路由用到Middleware,
修改app.controller.ts,增加 test test2 接口
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(): string {return this.appService.getHello();}@Get('test')getTest(): string {return 'test';}@Get('test2')getTest2(): string {return 'test2';}
}
修改 app.module.ts ,下面代码设置了只有 http://localhost:3000/ http://localhost:3000/test 才会使用到TestMiddleware中间件
import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TestMiddleware } from './test.middleware';@Module({imports: [],controllers: [AppController],providers: [AppService],
})
export class AppModule implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(TestMiddleware).forRoutes({ path: '', method: RequestMethod.GET })consumer.apply(TestMiddleware).forRoutes({ path: 'test', method: RequestMethod.GET })}
}
最后修改test.middleware.ts:
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';@Injectable()
export class TestMiddleware implements NestMiddleware {use(req: Request, res: Response, next: () => void) {console.log('进入 TestMiddleware');console.log('接口', req.url);next();console.log('结束 TestMiddleware');}
}
我们依次访问 http://localhost:3000/ http://localhost:3000/test http://localhost:3000/test2
接着回到控制台可以发现:
可以看到只有 / /test 这两个接口才调用到Middleware中间件 以上就是 Nest 里 middleware 的用法
可以看到上面图片 Middleware 是通过class实现的,使用class实现可以让我们进行依赖注入,例如
通过 @Inject 注入 AppService 到 middleware:
test.middleware.ts:
import { Inject, Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
import { AppService } from './app.service';@Injectable()
export class TestMiddleware implements NestMiddleware {@Inject(AppService)private readonly appService: AppService;use(req: Request, res: Response, next: () => void) {console.log('进入 TestMiddleware');console.log('接口', req.url);console.log('调用了service', this.appService.getHello());next();console.log('结束 TestMiddleware');}
}
接着我们访问需要知道到中间件的接口 例如 http://localhost:3000/
可以看到 我们调用了service,这就是 Nest 注入的依赖。