最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

用请求主体数据以外的其他数据自动填充DTO字段

运维笔记admin10浏览0评论

用请求主体数据以外的其他数据自动填充DTO字段

用请求主体数据以外的其他数据自动填充DTO字段

我有一个带有两个只读字段的类CreateFolderDto

export class CreateFolderDto {
    public readonly name: string
    public readonly user_id: number
}

我有一个控制器,它是:

@UseGuards(AuthGuard('jwt'))
@Post()
public create(@Request() req, @Body() createFolderDto: CreateFolderDto) {
    return this.folderService.create(createFolderDto)
}

发送到我的控制器的请求是一个很好的请求,我仅以name格式发送json,并在标头中发送accessTokenaccessToken允许我使用user_id从请求中获取我的req.user.id

DTO字段user_id不会自动填写。我想自动填写。

这是一种自动填充我的createFolderDto.user_id变量的方法吗?

回答如下:通常,聚合字段可以使用DTO的自定义构造函数添加:

export class CreateFolderDto { public readonly name: string public readonly session_uuid: string constructor(bodyValue: any = {}) { this.name = bodyValue.name this.session_uuid = generateUuid() } }

但是在您的情况下,user附加到request本身,所以我相信您有以下选择:

    签出将user附加到自身的代码。如果您使用的是NestJS文档中介绍的JWT Auth,则无法采用这种方式。
  1. 您可以编写自定义拦截器:

  • Injectable() export class ExtendBodyWithUserId implements NestInterceptor { async intercept(context: ExecutionContext, next: CallHandler) { const request = context.switchToHttp().getRequest() request.body.user_id = request.user return next.handle() } } // usage @UseGuards(AuthGuard('jwt')) @UseInterceptors(ExtendBodyWithUserId) @Post() public create(@Request() req, @Body() createFolderDto: CreateFolderDto) { return this.folderService.create(createFolderDto) }

    最后但并非最不重要的是,一些个人推荐。考虑一下您将使用这个拦截器作为扩展的程度,因为过多的“ extras”都会使代码库膨胀。

    我建议将folderService签名更改为:create(createFolderDto: CreateFolderDto, user: User),其中文件夹dto仅具有名称,而没有与用户相关的条目。您保持一致,分离和明确的意图。在create的实现中,您可以进一步传递user.id。按照这种方式,您不必编写自定义拦截器。

    选择方式,并希望代码库中的一致性与您同在!

  • 发布评论

    评论列表(0)

    1. 暂无评论