Случай использования:

Вложенный анализ JSON в API REST часто требуется, когда полезные данные ответа или запроса API содержат сложные иерархические структуры данных.

Вложенный анализ JSON — это фундаментальный процесс в REST API, который позволяет разработчикам эффективно создавать access, manipulate, validate и model complex data структуры. Он играет решающую роль в работе с иерархическими данными и обеспечивает бесперебойную связь и взаимодействие между API и приложением, которое его использует.

Разбор схемы в NestJS:

Сложный анализ схемы в NestJS REST API можно выполнить с помощью библиотек class-validator и class-transformer. Эти библиотеки позволяют определять и проверять сложные структуры данных с помощью декораторов.

Во-первых, убедитесь, что у вас установлены необходимые зависимости:

npm install class-validator class-transformer

Предположим, у вас есть конечная точка API, которая ожидает полезных данных JSON со сложной структурой. Вот пример того, как вы можете определить схему и выполнить синтаксический анализ и проверку в NestJS:

  1. Предположим, нам нужно разобрать следующий JSON
 {
  "userId": "11bf5b37-e0b8-42e0-8dcf-dc8c4aefc000",
  "firstName": "Sunil",
  "lastName": "Kumar",
  "email": "[email protected]",
  "type": "user",
  "addresses": [
    {
      "street": "123 Street",
      "city": "City 1",
      "location": {
        "lat": 123.45,
        "lng": 67.89
      }
    },
    {
      "street": "456 Street",
      "city": "City 2",
      "location": {
        "lat": 12.34,
        "lng": 56.78
      }
    }
  ]
}

2. Определите DTO (объект передачи данных), представляющий структуру полезной нагрузки. Например, предположим, что у вас есть полезная нагрузка, содержащая информацию о пользователе и его адресах:

// location.dto.ts
import { IsNumber, IsOptional } from 'class-validator';

export class LocationDTO {
  @IsNumber()
  lat: number;

  @IsNumber()
  lng: number;
}

// address.dto.ts
import { IsString, ValidateNested, IsNotEmpty } from 'class-validator';
import { Type } from 'class-transformer';
import { LocationDTO } from './location.dto';

export class AddressDTO {
  @IsString()
  @IsNotEmpty()
  street: string;

  @IsString()
  @IsNotEmpty()
  city: string;

  @ValidateNested()
  @Type(() => LocationDTO)
  location: LocationDTO;
}

// user.dto.ts
import { IsString, ValidateNested, IsEmail, IsNotEmpty, IsArray, ArrayNotEmpty, IsEnum } from 'class-validator';
import { Type } from 'class-transformer';
import { AddressDTO } from './address.dto';

enum UserType {
  ADMIN = 'admin',
  USER = 'user',
}

export class UserDTO {
  @IsString()
  @IsNotEmpty()
  name: string;

  @IsEmail()
  @IsNotEmpty()
  email: string;

  @IsEnum(UserType)
  type: UserType;

  @IsArray()
  @ArrayNotEmpty()
  @ValidateNested({ each: true })
  @Type(() => AddressDTO)
  addresses: AddressDTO[];
}

3. В контроллере импортируйте DTO и используйте его для проверки и анализа входящей полезной нагрузки:

// user.controller.ts
import { Controller, Post, Body } from '@nestjs/common';
import { plainToClass } from 'class-transformer';
import { validate } from 'class-validator';
import { UserDTO } from './user.dto';

@Controller('users')
export class UserController {
  @Post()
  async createUser(@Body() payload: UserDTO) {
    const user = plainToClass(UserDTO, payload);
    const errors = await validate(user, { skipMissingProperties: true });

    if (errors.length > 0) {
      // Handle validation errors
      throw new Error('Validation failed!');
    }

    // Process the valid payload
    // ...

    return { message: 'User created successfully' };
  }
}

В этом примере метод createUser в контроллере получает полезную нагрузку и пытается преобразовать ее в экземпляр класса UserDTO, используя plainToClass из class-transformer. Вложенные объекты (AddressDTO и LocationDTO) также проверяются с помощью соответствующих декораторов. Обратите внимание, что параметр { skipMissingProperties: true } передается функции validate, чтобы игнорировать отсутствующие свойства во время проверки.

Пожалуйста, проверьте полный код в главе 7 в моем репозитории git https://github.com/Sunilrana1978/Nestjs-rest-api-demo/tree/chapter7

Теперь давайте проверим, работает ли проверка должным образом. Запустите приложение с помощью приведенной ниже команды.

 Nestjs-rest-api-demo git:(chapter7) ✗ npm run start:dev

затем используйте конечную точку публикации для анализа схемы.

В приведенном ниже примере я дал все правильные значения для каждого поля. Так что исключений нет.

Теперь давайте передадим некоторые неверные значения и отсутствующие значения. Вы можете видеть, что есть ошибка HTTP 400, и есть сообщение для каждого типа неправильного значения.

Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏, чтобы выразить свою поддержку автору 👇