首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有办法将缺省值设置为缺少/可选的JSON属性?

有没有办法将缺省值设置为缺少/可选的JSON属性?
EN

Stack Overflow用户
提问于 2019-01-04 02:25:04
回答 2查看 5.4K关注 0票数 2

我使用NodeJs/NestJs来构建RESTful服务。我创建了一些对象来匹配请求JSON。在这些对象中有一些可选的属性,但如果客户端不通过JSON发送它们,我希望将它们设置为默认值。

实现这一目标的最佳方法是什么?

这是我与JSON匹配的DTO。

import { IsDefined, IsNumber, Min } from 'class-validator';
import { ApiModelProperty, ApiModelPropertyOptional } from '@nestjs/swagger';

export class RequestDto {
    @IsDefined()
    @IsNumber()
    @Min(0)
    @ApiModelProperty({description: 'The current age.'})
    public CurrentAge: number;

    @ApiModelPropertyOptional({description: 'The existing saving amount.'})
    public ExistingSavingAmount: number = 0;
}

这是我的NestJs控制器

import { Controller, Post, Body, Param } from '@nestjs/common';
import { RequestDto } from './Dto/Request.Dto';
import { ApiResponse, ApiOperation } from '@nestjs/swagger';

@Controller('mycontroller')
export class MyController {
    @Post('MyEndPoint')
    @ApiOperation({ title: 'Do something' })
    @ApiResponse({ status: 201, description: 'Something is done' })
    public doSomething(@Body() request: RequestDto) {
        // do more jobs
    }
}

我启动该服务,并将JSON发布到我的终点

{
    "CurrentAge": 40,
}

在我的控制器中,我看到ExistingSavingAmount是空的,而不是值为0。但是如果我直接实例化RequestDto,我可以看到ExistingSavingAmount的值是0。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-04 03:43:18

只有当RequestDto被实例化为一个类时,您的默认值才适用。由于您已经在使用类验证器进行验证,因此可以使用classTransformer.plainToClass()来实例化该类。

如果您使用的是内置ValidationPipe,则可以使用{ transform: true }选项自动实例化RequestDto类:

@UsePipes(new ValidationPipe({ transform: true }))
@Post('MyEndPoint')
public doSomething(@Body() request: RequestDto) {

或者作为全局管道:

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);
  app.useGlobalPipes(new ValidationPipe({ transform: true }));
  await app.listen(3000);
}
bootstrap();
票数 5
EN

Stack Overflow用户

发布于 2019-01-04 02:54:18

好吧,如果没有来自OP的代码样本,这个响应的保真度可能需要改进。也就是说,要做到这一点,"nest-y“方法是通过TransformPipe

他们给出的典型示例是针对ParseIntPipe的:

import { Injectable, BadRequestException} from '@nestjs/common';

@Injectable()
export class ParseIntPipe {
  transform(value, metadata) {
    const val = parseInt(value, 10);
    if (isNaN(val)) {
      throw new BadRequestException('Validation failed');
    }
    return val;
  }
}

在不知道默认值是什么的情况下,我将假设它是一个类似于产品的东西,而你想要默认一些东西,并将一些东西放在一个空字符串中:

import { Injectable, BadRequestException} from '@nestjs/common';

// we will assume you have your own validation for the non-optional bits
const optionalDefaults = {
   description: '',
   category: 'Miscelleneous'
}

@Injectable()
export class ProductDefaultsPipe {
  transform(value, metadata) {
    const val = Object.assign(optionalDefaults, value);
    return val;
  }
}

现在,也就是说您可能正在使用提供模式和模型定义的东西(比如Joi或Mongoose)。如果是这样的话,我建议您设置该模式中的所有默认值和验证,然后在TransformPipe中应用该模式,而不是编写太多自定义代码。例如,如果您有一个ProductSchema,这将适用于您:

@Injectable()
export class ProductDefaultsPipe {
  async transform(value, metadata) {
    const val = new Product(value);
    const isValid = await val.validate();
    if (!isValid) {
       throw new BadRequestException('Validation failed');
    }
    return val;
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54027807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档