NestJS 删除不属于 dto 一部分的数据

发布于 2025-01-14 03:00:51 字数 782 浏览 1 评论 0原文

我有一个像这样的 NestJS 控制器:

@Put('/:id')
  updateLocalityInfo(
    @Query('type') type: string,
    @Body() data: EditLocalityDto,
    @Body('parentId', ParseIntPipe) parentId: number,
    @Param('id', ParseIntPipe) id: number,
  ) {
    console.log(data);
    return this.localitiesService.updateLocalityInformation(
      type,
      data,
      id,
      parentId,
    );
  }

我在其中获取了一堆数据。但是,我遇到了 Dto 和 ParentId 变量的问题。当我调用此路由时,parentId 似乎是 Dto 数据的一部分。 console.log 显示

{ name: 'exampleName', parentId: '1' }

我的 dto 只有一个名称:

import { ApiProperty } from '@nestjs/swagger';

export class EditLocalityDto {
  @ApiProperty()
  name: string;
}

我想摆脱作为 dto 数据一部分的parentId。一般来说我该怎么做

I have a NestJS controller like this:

@Put('/:id')
  updateLocalityInfo(
    @Query('type') type: string,
    @Body() data: EditLocalityDto,
    @Body('parentId', ParseIntPipe) parentId: number,
    @Param('id', ParseIntPipe) id: number,
  ) {
    console.log(data);
    return this.localitiesService.updateLocalityInformation(
      type,
      data,
      id,
      parentId,
    );
  }

in which I'm getting a bunch of data. however, I'm having issues with the Dto and the parentId variable. When I call this route the parentId seems to be part of the Dto-data. the console.log shows

{ name: 'exampleName', parentId: '1' }

my dto only has a name:

import { ApiProperty } from '@nestjs/swagger';

export class EditLocalityDto {
  @ApiProperty()
  name: string;
}

I want to get rid of the parentId being part of the dto-data. how do I do that in general

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

平安喜乐 2025-01-21 03:00:51

您可以考虑以下两种方法之一

解决方案 1

使用 TS 从 DTO 中排除冗余属性:

@Put('/:id')
  updateLocalityInfo(
    @Query('type') type: string,
    @Body() { parentId: _, ...data }: EditLocalityDto,
    @Body('parentId', ParseIntPipe) parentId: number,
    @Param('id', ParseIntPipe) id: number,
  ) {
    console.log(data);
    return this.localitiesService.updateLocalityInformation(
      type,
      data,
      id,
      parentId,
    );
  }

解决方案 2

您可以将其添加到 DTO 本身,而不是排除该属性并在那里验证它:

@Put('/:id')
  updateLocalityInfo(
    @Query('type') type: string,
    @Body() { parentId, ...data }: EditLocalityDto,
    @Param('id', ParseIntPipe) id: number,
  ) {
    console.log(data);
    return this.localitiesService.updateLocalityInformation(
      type,
      data,
      id,
      parentId,
    );
  }

///

import { ApiProperty } from '@nestjs/swagger';

export class EditLocalityDto {
  @IsInt()
  parentId: number

  @ApiProperty()
  name: string;
}

我更喜欢后者

You could think of one of 2 approaches

Solution 1

Exclude the redundant property using TS from the DTO:

@Put('/:id')
  updateLocalityInfo(
    @Query('type') type: string,
    @Body() { parentId: _, ...data }: EditLocalityDto,
    @Body('parentId', ParseIntPipe) parentId: number,
    @Param('id', ParseIntPipe) id: number,
  ) {
    console.log(data);
    return this.localitiesService.updateLocalityInformation(
      type,
      data,
      id,
      parentId,
    );
  }

Solution 2

Instead of excluding the property, you could add it to the DTO itself and validate it there:

@Put('/:id')
  updateLocalityInfo(
    @Query('type') type: string,
    @Body() { parentId, ...data }: EditLocalityDto,
    @Param('id', ParseIntPipe) id: number,
  ) {
    console.log(data);
    return this.localitiesService.updateLocalityInformation(
      type,
      data,
      id,
      parentId,
    );
  }

///

import { ApiProperty } from '@nestjs/swagger';

export class EditLocalityDto {
  @IsInt()
  parentId: number

  @ApiProperty()
  name: string;
}

I'd prefer the later

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文