NestJS 中间件,其实就这么简单

1,372 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

中间件

中间件是路由处理程序之前调用的函数。作为一个后端服务,设置中间件后,一个请求过来,都会先响应,中间函数结束后才会到具有服务函数。

中间件可以做任何的事情:

  • 执行任何代码
  • 对请求和响应对象进行更改
  • 结束请求 - 响应周期

自定义中间件类

自定义中间件只需要实现 NestMiddleware 接口, 而函数没有任何特殊的要求。自定义中间件都不会结束整个从请求-响应周期,所以为了避免请求被挂起,需函数use方法中最后要调用 next() 方法,将控制传递给下一个中间件函数。

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
    use(req: any, res: any, next: () => void) {
        console.log('test....');
        /** 具体的logger 逻辑 */
        next(); // 此处必须写上
    }
​
}

第三方中间件类

基于第三方已经封装好的中间件类,仅需通过 npm install 安装 然后使用。

使用

全局中使用中间件

全局中间件

想要在每个路由之前都绑定中间件时,可以使用 INestApplication 实例提供的方法

```
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
​
```

应用中间件

应用中间件就是说将中间件设置在Module层之上,这种方式的中间件Module 层必须实现 NestModule 接口

比如 UserModule 层需要使用中间件,那么需要实现NestModule 接口

@Module({
    controllers: [UserController],
    providers: [UserService]
})
export class UserModule implements NestModule {
    configure(consumer: MiddlewareConsumer) {
        consumer.apply(LoggerMiddleware)
    }
}

还可以在配置中间件时将包含路由路径的对象和请求方法传递给 forRoutes()方法,从而进一步将中间件限制为特定的请求方法。

export class UserModule implements NestModule {
    configure(consumer: MiddlewareConsumer) {
        consumer.apply(LoggerMiddleware).forRoutes('/user')
    }
}
  • MiddlewareConsumer 是一个帮助类。它提供了几种内置方法来管理中间件
  • forRoutes(). 可接受一个字符串、多个字符串、对象、一个控制器类甚至多个控制器类

LoggerMiddleware 类是通过实现NestMiddleware 接口。NestJs 还提供了另一种方式:函数式中间件。

函数式中间件

就是通过定义一个简单的函数,然后在 Module 中使用

export function logger(req, res, next) {
  console.log(`Request...`);
  next();
};
​
// 使用
consumer.apply(logger)

多个中间件使用

为了绑定顺序执行的多个中间件,我们可以在 apply() 方法内用逗号分隔它们。