返回

中间件的力量:深入了解 Nest 的动态特性

前端

Nest 的中间件:揭开 Nest 幕后的动态世界

之前我们通过模块化的方式静态地了解了 Nest,现在,让我们通过运行时的动态过程来深入探讨 Nest。早期的文章简要介绍了 Nest 处理请求和响应过程中的一些关键概念,在接下来的几篇文章中,我们将深入了解 Nest 的处理过程。

中间件是 Express 中一项非常强大的特性,它允许我们在请求到达路由处理程序之前或之后对其进行拦截和修改。在 Nest 中,中间件的概念得到了扩展,使其不仅适用于 HTTP 请求,还适用于事件处理程序和 gRPC 处理程序。

中间件的类型

Nest 中有两种类型的中间件:

  • 全局中间件: 应用于整个应用程序的中间件。
  • 路由级中间件: 只应用于特定路由的中间件。

创建中间件

为了创建中间件,我们需要使用 @Middleware() 装饰器来装饰一个类。这个类必须实现 NestMiddleware 接口,该接口定义了两个方法:

  • resolve():在处理请求之前被调用。
  • next():在处理请求之后被调用。

使用中间件

我们可以通过以下两种方式使用中间件:

  • 全局中间件:app.module.ts 中的 configure() 方法中使用 useGlobalMiddleware() 方法注册全局中间件。
  • 路由级中间件: 使用 use() 方法将中间件应用于特定路由。

中间件的应用

中间件可以用于各种目的,包括:

  • 验证和授权
  • 日志记录
  • 处理错误
  • 转换数据

案例:验证中间件

让我们创建一个验证中间件来验证请求中的 JWT 令牌:

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
import { verify } from 'jsonwebtoken';

@Injectable()
export class AuthMiddleware implements NestMiddleware {
  resolve(req: Request, res: Response, next: Function) {
    const token = req.headers['authorization'];

    if (!token) {
      return res.status(401).send('Unauthorized');
    }

    try {
      verify(token, 'your-secret-key');
      next();
    } catch (err) {
      return res.status(401).send('Unauthorized');
    }
  }
}

结论

中间件是 Nest 中一项强大的工具,它允许我们轻松地拦截和修改请求和响应。通过使用中间件,我们可以增强应用程序的安全性、日志记录和其他功能。在接下来的文章中,我们将更深入地探讨 Nest 的处理过程,包括请求生命周期、管道和异常处理。