2.3 中间件

  1. 中间件需实现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);
  1. 依赖注入

中间件应用在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();
  }
}
  1. 函数中间件

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);//多个中间件用分号分隔
  }
}
  1. 全局中间件

app.use(test);//接收的是一个方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值