中间件需实现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);//接收的是一个方法