中间件需实现NestMiddleware
import { Logger } from '@nestjs/common';
@Injectable()
export class LogMiddleware implements NestMiddleware {
private readonly logger = new Logger(LogMiddleware.name);
use(req: any, res: any, next: () => void) {
this.logger.error(req.url, 'helloworld');
next();
}
}
可以将中间件应用到某个模块上,经测试,无论是把中间件应用到app.module.ts还是别的模块上,总是对全局生效的
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { KeywordModule } from './keyword/keyword.module';
import { LazyModule } from './lazy/lazy.module';
import { LogMiddleware } from './log/log.middleware';
@Module({
controllers: [AppController],
providers: [AppService],
imports: [KeywordModule, LazyModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LogMiddleware).forRoutes('/');
}
}
consumer.apply(LogMiddleware).forRoutes();//参数缺省,则代表中间件没有应用在任何路由上
//以字符串的形式forRoutes,在中间件中打印req.url时,会不包含forRootes中存在的路径
//比如forRoutes('keyword'),请求keyword,中间件中打印req.url应该是/
//请求keyword/id,req.url应该是/id
consumer.apply(LogMiddleware).forRoutes('keyword');
consumer.apply(LogMiddleware).forRoutes('keyword', 'pro');//应用keyword及keyword/*路由,pro同理
consumer.apply(LogMiddleware).forRoutes({ path: 'keyword', method: RequestMethod.GET });//精确匹配keyword路由,如果要模糊匹配keyword及keyword/..路由,使用通配符
consumer.apply(LogMiddleware).forRoutes(ProController, KeywordController);//controller形式应用
排除用法
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
.forRoutes(CatsController);
依赖注入
中间件应用在app.module.ts上,所以便可以通过依赖注入获取app.service.ts
import { Inject, Injectable, NestMiddleware } from '@nestjs/common';
import { Logger } from '@nestjs/common';
import { AppService } from '../app.service';
@Injectable()
export class LogMiddleware implements NestMiddleware {
@Inject()
private readonly app: AppService;
private readonly logger = new Logger(LogMiddleware.name);
use(req: any, res: any, next: () => void) {
this.logger.error(this.app.getHello());
next();
}
}
函数中间件
export function test(req, res, next) {
console.log(`Request...${req.url}`);
next();
}
import {
MiddlewareConsumer,
Module,
NestModule,
RequestMethod,
} from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { KeywordModule } from './keyword/keyword.module';
import { LazyModule } from './lazy/lazy.module';
import { LogMiddleware } from './log/log.middleware';
import { ProController } from './pro/pro.controller';
import { KeywordController } from './keyword/keyword.controller';
import { test } from './log/test.middleware';
@Module({
controllers: [AppController],
providers: [AppService],
imports: [KeywordModule, LazyModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LogMiddleware, test).forRoutes(KeywordController);//多个中间件用分号分隔
}
}
全局中间件
app.use(test);//接收的是一个方法