5. 中间件:Nest.js 的强大工具

205 阅读3分钟

5. 中间件:Nest.js 的强大工具

介绍

欢迎回来!在前几篇文章中,我们已经了解了如何创建控制器和服务,并使用它们来处理 HTTP 请求。在这篇文章中,我们将探讨 Nest.js 中的中间件(Middleware)。中间件是处理请求和响应的强大工具,可以在请求到达控制器之前或响应发送到客户端之前执行一些操作。让我们一起深入了解中间件的工作原理和使用方法。

什么是中间件?

中间件是一个函数,它可以访问请求对象(req)、响应对象(res)和下一个中间件函数(next)的生命周期方法。在请求到达路由处理器之前,中间件可以对请求进行处理、修改或终止。中间件在 Express.js 和 Nest.js 中都非常常见。

创建一个中间件

让我们通过一个实际例子来了解如何创建和使用中间件。假设我们要创建一个日志中间件,用于记录每个请求的详细信息。

首先,使用 Nest CLI 创建一个新的中间件:

nest generate middleware logger

这条命令会在 src 目录下生成一个 logger.middleware.ts 文件。让我们看看这个文件的内容:

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

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(`Request...`);
    next();
  }
}
  • @Injectable():将类标记为可注入的服务。
  • use 方法:中间件的核心方法,接收请求对象、响应对象和下一个中间件函数。

使用中间件

要使用中间件,我们需要将其应用到特定的路由或全局范围内。让我们将 LoggerMiddleware 应用到 BooksController 的所有路由。

打开 books.module.ts 文件,修改如下:

import { Module, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
import { BooksController } from './books.controller';
import { BooksService } from './books.service';
import { LoggerMiddleware } from './logger.middleware';

@Module({
  controllers: [BooksController],
  providers: [BooksService],
})
export class BooksModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes(BooksController);
  }
}

在这个例子中,我们使用 MiddlewareConsumerLoggerMiddleware 应用到 BooksController 的所有路由。每次请求到达 BooksController 之前,都会先经过 LoggerMiddleware

记录请求详细信息

让我们修改 LoggerMiddleware,记录每个请求的详细信息,如方法、URL 和时间戳。

修改 logger.middleware.ts 文件如下:

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

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    const { method, originalUrl } = req;
    const start = Date.now();

    res.on('finish', () => {
      const duration = Date.now() - start;
      console.log(`${method} ${originalUrl} ${res.statusCode} - ${duration}ms`);
    });

    next();
  }
}

在这个例子中,我们记录了请求的方法、URL 和响应时间。当响应结束时,我们计算请求的持续时间并记录下来。

全局中间件

如果你希望中间件应用于所有路由,可以将其注册为全局中间件。打开 main.ts 文件,修改如下:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { LoggerMiddleware } from './logger.middleware';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(LoggerMiddleware);
  await app.listen(3000);
}
bootstrap();

在这个例子中,我们使用 app.use 方法将 LoggerMiddleware 注册为全局中间件。这样,所有的请求都会经过 LoggerMiddleware

结论

在这篇文章中,我们深入探讨了 Nest.js 中的中间件,并通过实际例子展示了如何创建和使用中间件。我们还学习了如何将中间件应用到特定的路由或全局范围内。

中间件是处理请求和响应的强大工具,可以在请求到达控制器之前或响应发送到客户端之前执行一些操作。通过使用中间件,我们可以实现日志记录、身份验证、请求验证等功能,使应用更加灵活和可维护。

感谢你的阅读!如果你有任何问题或建议,欢迎在评论区留言。我们下次再见!

预告

在下一篇文章中,我们将探讨 Nest.js 中的管道(Pipes)。管道是处理请求数据转换和验证的强大工具,可以在请求到达控制器之前对数据进行处理。敬请期待!