Случай использования:
Вложенный анализ 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:
- Предположим, нам нужно разобрать следующий 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, и есть сообщение для каждого типа неправильного значения.
Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏, чтобы выразить свою поддержку автору 👇