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

时间:2019-07-28 15:38:45

标签: javascript typescript nestjs

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

我想从用户那里收到经过认证的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'}
}

如何从此处理程序中的同一请求中获取经过身份验证的用户和经过验证的正文?

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

不好意思,为什么我不使用request.body?因为有一个自定义验证管道。

1 个答案:

答案 0 :(得分:1)

有点困惑,但是可以肯定的是,您需要添加AuthGuard才能对中间件进行身份验证

<script>
  • 仅当您正确创建了保护措施后,才可能在auth中间件中设置用户。
  • 验证管道要求将类验证器元数据应用于属性的类/ DTO

示例DTO

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