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);
}
}
在这个例子中,我们使用 MiddlewareConsumer 将 LoggerMiddleware 应用到 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)。管道是处理请求数据转换和验证的强大工具,可以在请求到达控制器之前对数据进行处理。敬请期待!