乐闻世界logo
搜索文章和话题

NestJS 如何在拦截器中的获取请求内容?

8 个月前提问
6 个月前修改
浏览次数39

1个答案

1

在 NestJS 中,拦截器(Interceptors)提供了一种强大的方式来拦截和处理进出的请求和响应。要在拦截器中获取请求内容,您需要访问当前执行的上下文,这可以通过实现 Interceptor 接口并使用 ExecutionContext 类来完成。

下面是如何在拦截器中获取请求内容的步骤:

  1. 创建拦截器: 首先,您需要创建一个新的拦截器。可以通过使用 @Injectable 装饰器来创建,然后实现 NestInterceptor 接口。

  2. 实现 intercept 方法: NestInterceptor 接口要求实现一个 intercept 方法,该方法接收 ExecutionContextCallHandler 两个参数。

  3. 从 ExecutionContext 获取请求对象: ExecutionContext 对象提供了访问请求和响应对象的能力。通过 switchToHttp 方法,您可以获取当前的 HTTP 请求对象。

  4. 读取请求内容: 一旦拥有了请求对象,就可以通过它的属性如 bodyqueryparams 等来访问请求的内容。

下面是一个简单的例子,说明如何在 NestJS 拦截器中获取请求内容:

typescript
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; @Injectable() export class LoggingInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { const request = context.switchToHttp().getRequest(); const body = request.body; // 获取请求体 const query = request.query; // 获取查询参数 const params = request.params; // 获取路由参数 console.log(`Incoming Request: ${request.method} ${request.url}`); console.log('Body:', body); console.log('Query:', query); console.log('Params:', params); // 继续执行请求的下一步操作 return next .handle() .pipe( tap(() => console.log(`Outgoing Response: The response has been sent.`)), ); } }

在上面的例子中,LoggingInterceptor 拦截器通过 ExecutionContext 获取了当前的 HTTP 请求,并打印了请求方法、URL、请求体、查询参数和路由参数。然后,它通过 next.handle() 允许请求继续其处理流程,并且在响应发出后打印了一条日志消息。

要将这个拦截器应用到您的 NestJS 应用程序中,您需要在模块的 providers 数组中注册它,并且可以在控制器或特定路由上使用 @UseInterceptors 装饰器来激活它。

2024年6月29日 12:07 回复

你的答案