Объясните назначение декораторов @nestjs/graphql Resolver и @nestjs/graphql Scalar и их связь с GraphQL в NestJS.
В NestJS, GraphQL может быть интегрирован с помощью модуля @nestjs/graphql
, который предоставляет мощные инструменты для создания API на основе спецификации GraphQL. Два ключевых компонента этого модуля - это декораторы @Resolver
и @Scalar
.
Декоратор @Resolver
Декоратор @Resolver
используется для определения класса, который отвечает за обработку запросов GraphQL для определённого типа (или нескольких типов). Каждый резолвер может содержать методы, которые сопоставляются с полями в GraphQL-схеме.
Пример использования @Resolver:
import { Resolver, Query, Args } from '@nestjs/graphql';
import { User } from './user.entity';
import { UsersService } from './users.service';
@Resolver(() => User)
export class UsersResolver {
constructor(private usersService: UsersService) {}
@Query(() => [User])
async users() {
return this.usersService.findAll();
}
@Query(() => User)
async user(@Args('id') id: number) {
return this.usersService.findOne(id);
}
}
В этом примере класс UsersResolver
определяет два метода users
и user
, которые объявлены как GraphQL-запросы (Query). Первый метод возвращает массив пользователей, а второй - конкретного пользователя по его id
.
Декоратор @Scalar
Декоратор @Scalar
используется для определения пользовательских скалярных типов, которые не входят в стандартные типы GraphQL (такие как Int, String, Float и т.д.). Это может понадобиться, например, для работы с специальными типами данных, такими как даты или JSON-объекты.
Пример использования @Scalar:
import { Scalar, CustomScalar } from '@nestjs/graphql';
import { Kind } from 'graphql';
@Scalar('Date', () => Date)
export class DateScalar implements CustomScalar<number, Date> {
description = 'Date custom scalar type';
parseValue(value: number): Date {
return new Date(value); // Значение из переменной запроса
}
serialize(value: Date): number {
return value.getTime(); // Значение, которое будет отправлено клиенту
}
parseLiteral(ast: any): Date {
if (ast.kind === Kind.INT) {
return new Date(parseInt(ast.value, 10)); // Преобразование значения
}
return null;
}
}
В этом примере DateScalar
определяет пользовательский скалярный тип для работы с датами. Методы parseValue
, serialize
и parseLiteral
позволяют обрабатывать данные, когда они поступают из запросов и когда они возвращаются клиенту.
Связь с GraphQL
Декораторы @Resolver
и @Scalar
играют важную роль в построении структуры вашего GraphQL API в NestJS. @Resolver
связывает конкретные классы с типами GraphQL, осуществляя обработку запросов и возрождение данных, в то время как @Scalar
помогает определять и обрабатывать нестандартные типы данных.
Сквозное использование этих декораторов позволяет разработчикам гибко строить и расширять свои API, делая их более выразительными и соответствующими требованиям конкретных приложений.
Таким образом, освоение этих декораторов значительно улучшает опыт разработки и позволяет создавать более сложные и функциональные приложения на платформе NestJS с поддержкой GraphQL.