Middleware是在request/response周期开始/结束修改request/response物件,这是express framework的feature。
以Logger功能为例,建立logger.middleware.ts
import { Injectable, NestMiddleware, MiddlewareFunction } from '@nestjs/common';
@Injectable()
export class LoggerMiddleware implements NestMiddleware { // 必须实现NestMiddleware接口
resolve(...args: any[]): MiddlewareFunction {
return (req, res, next) => { // 會接收request、response及next方法
console.log('Logger....');
next(); //告诉nest.js继续下一个middleware,如果没有,则交给request handler
};
}
}
Middleware是套用在Module Level,到app.module.ts新增middleware相关代码
修改app.module.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LoggerMiddleware } from './shared/middlewares/logger.middleware';
import { SharedModule } from './shared/shared.module';
import {cors} from 'cors'; //允許cors
@Module({
imports: [SharedModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule{
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware, cors) //指定要套用哪个Middleware,可以套用多个middleware,以逗點分隔
.forRoutes(AppController); // 指定哪些routes要套用,可以传入Controller或是Controller数组
}
}
用Postman发出request测试
2018110512.png
其他设定
- exclude()
- 指定哪些route不套用middleware
例如,POST不套用
修改app.module.ts如下:
...
configure(consumer: MiddlewareConsumer ) {
consumer
.apply(LoggerMiddleware, cors) // 要套用哪个Middleware,可以套用多个middleware,以逗号分隔
.exclude( // 列举排除的routes
{ path: '/', method: RequestMethod.POST },
{ path: 'users', method: RequestMethod.GET}
)
.forRoutes(AppController); // 指定哪些routes要套用,可以传入Controller或是Controller数组
}
...
tuiguang.png推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。
网友评论