【问题标题】:Convert stringified JSON to Object using class-transformer使用类转换器将字符串化的 JSON 转换为对象
【发布时间】:2021-08-25 06:56:33
【问题描述】:

有一个nest.js 项目,在请求正文中我们期望一个对象,该对象的一个​​属性包含字符串化的JSON 值。想法是将此字符串转换为对象,对其进行验证并作为对象传递给控制器 ValidationPipe 设置:

app.useGlobalPipes(
  new ValidationPipe({
   whitelist: true,
   transform: true,
  }),
);

DTO:

@Transform(parseJson, { toClassOnly: true })
@Type(() => AdditionalInfo)
@IsNotEmptyObject()
@ValidateNested()
additionalInfo: AdditionalInfo;

parseJson 函数

export function parseJson(options: {
  key: string;
  value: string;
  obj: string | Record<string, any>;
}): Record<string, any> {
  try {
    return JSON.parse(options.value);
  } catch (e) {
    throw new BadRequestException(`${options.key} contains invalid JSON `);
  }
}

由于某些原因,在控制器中解析的值丢失了,我们收到了一个空对象。

【问题讨论】:

  • 向我们提供您传递给您的路线的数据,这些数据也将得到验证。

标签: nestjs class-transformer


【解决方案1】:

看起来@Transform 仅适用于原语。 决定创建ParseJsonPipe 并改用它。 用法(在控制器中):

@Body('additionalInfo', new ParseJsonPipe(), new ValidationPipe(AdditionalInfoDto)) additionalInfo: AdditionalInfo,

ParseJsonPipe:

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

@Injectable()
export class ParseJsonPipe implements PipeTransform<string, Record<string, any>> {
  transform(value: string, metadata: ArgumentMetadata): Record<string, any> {
    const propertyName = metadata.data;
    try {
      return JSON.parse(value);
    } catch (e) {
      throw new BadRequestException(`${propertyName} contains invalid JSON `);
    }
  }
}

ValidationPipe@nestjs/common 实现PipeTransformtransform 函数如下所示:

async transform(value: any): Promise<any> {
    if (!this.metaType) { // AdditionalInfoDto
      return value;
    }
    const object = plainToClass(this.metaType, value);
    const errors = await validate(object);
    if (errors.length > 0) {
      const message = this.getErrorMessages(errors);
      throw new BadRequestException({ message });
    }
    return value;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-27
    • 2020-05-27
    • 1970-01-01
    • 2011-04-23
    • 2012-06-14
    • 2012-02-20
    • 2015-01-03
    相关资源
    最近更新 更多