如何在 NestJS 控制器处理程序的请求中获取“已验证的正文”和“已验证的用户”?

Posted

技术标签:

【中文标题】如何在 NestJS 控制器处理程序的请求中获取“已验证的正文”和“已验证的用户”?【英文标题】:How to get "validated Body" and "authenticated user" in a request of a NestJS Controller Handler? 【发布时间】:2019-12-06 02:51:54 【问题描述】:

我正在使用一个使用 "AuthGuard" with 'jwt' strategy. 的 NestJS 应用程序

我想从用户那里收到经过身份验证的POST

所以我添加了@Request() request 装饰属性,然后我得到request.user 来获取用户。如描述here

我还添加了 @Body() body 装饰属性来获取正文。

但我注意到我不能同时使用两者。只定义了第一个。

例如,如果我先定义@Body() body::

@Post()
@UsePipes(new ValidationPipe( transform: true )
public create(@Body() body, @Request() request) 
    console.log(body); //  name: 'test'
    console.log(request); //undefined

如果我先定义@Request() request

@Post()
@UsePipes(new ValidationPipe( transform: true )
public create(@Request() request, @Body() body) 
    console.log(body); // undefined
    console.log(request); //  name: 'test'

而且没有正文和验证

@Post()
public create(@Request() request) 
    console.log(request); //  name: 'test'

如何从这个 Handler 中的同一个请求中获取经过身份验证的用户和经过验证的正文?

奇怪的是 @Request() request 实际上返回的是正文,而不是请求本身

Obs,为什么我不使用 request.body ?因为自定义验证管道。

【问题讨论】:

当您执行@Body(ValidationPipe) body: any 时会发生什么?我认为正在发生的事情是验证管道正试图针对控制器中的两个变量运行,而不仅仅是您想要的那个。您的另一个选择是创建一个自定义装饰器以返回 req.user。你可以learn more about that here 我试过但效果相同。我也尝试删除正文,并注意到“请求”实际上给了我正文..我不知道我是否做错了什么。 您是否有一个正在复制的存储库?我很确定它在文档中提到不要使用库特定方法(即@Request()@Response())的某处,因为它使某些功能无法正常工作(如拦截器)所以我想知道这是否是问题跨度> 我只是能够隔离并定位故障点,不在上面的代码中。我将两个控制器放在两个不同的文件夹中,名称相同ListController 和相同的方法create()。由于某种原因,一种方法的定义正在干扰另一种方法。我刚刚重命名了控制器类并且它可以工作。我真的不知道为什么会发生这种情况,但它发生了。我会试着弄清楚,也许会问一个关于它的具体问题。 @JayMcDoniel ***.com/questions/57244179/… 【参考方案1】:

有点困惑,但很确定您需要添加 AuthGuard 以启用身份验证中间件

@AuthGuard(JwtGuard)
@Controller()
export class TestContoller 
  @Post('something')
  doTheThing(@Body(new ValidationPipe) body: SomeModelDTO, @Req() request): User 
     return request.user;
  

如果您正确创建了保护等,用户可能只会在 auth 中间件中设置。 验证管道需要一个类/DTO,其中包含应用于属性的类验证器元数据

DTO 示例

export class SomeModelDTO 
  @IsString()
  name: string;

  @IsArray()
  @IsOptional()
  arr: string[];

【讨论】:

以上是关于如何在 NestJS 控制器处理程序的请求中获取“已验证的正文”和“已验证的用户”?的主要内容,如果未能解决你的问题,请参考以下文章

NestJs - 如何在拦截器上获取请求正文

Nestjs如何同时使用http请求和Websocket

如何使用 NestJS 将纯文本作为我的请求正文传递?

如何从请求上下文nestjs中获取IP地址?

NestJS:如何在从 JWT AuthGuard 扩展的 GraphQL 自定义 Guard 中从请求中获取用户

如何在 Nestjs 中创建 mongodb 连接提供程序