Создайте схему и резолюры GraphQL с помощью TypeScript, используя классы и декораторы!
https://typegraphql.com
TypeGraphQL делает разработку API GraphQL приятным процессом, то есть определяя схему, используя только классы и немного магии декоратора.
Таким образом, чтобы создавать типы, такие как тип объекта или тип ввода, мы используем своего рода класс DTO. Например, чтобы объявить тип Recipe мы просто создаем класс и аннотируем его декораторами:
@ ObjectType ( )
class Recipe {
@ Field ( type => ID )
id : string ;
@ Field ( )
title : string ;
@ Field ( type => [ Rate ] )
ratings : Rate [ ] ;
@ Field ( { nullable : true } )
averageRating ?: number ;
}И мы получаем соответствующую часть схемы в SDL:
type Recipe {
id : ID !
title : String !
ratings : [ Rate ! ] !
averageRating : Float
}Тогда мы можем создавать запросы, мутации и резолюры поля. Для этой цели мы используем конвенцию, похожие на контроллер, которые называются «Резольверами». Мы также можем использовать удивительные функции, такие как инъекция зависимостей и аудитория:
@ Resolver ( Recipe )
class RecipeResolver {
// dependency injection
constructor ( private recipeService : RecipeService ) { }
@ Query ( returns => [ Recipe ] )
recipes ( ) {
return this . recipeService . findAll ( ) ;
}
@ Mutation ( )
@ Authorized ( Roles . Admin ) // auth guard
removeRecipe ( @ Arg ( "id" ) id : string ) : boolean {
return this . recipeService . removeById ( id ) ;
}
@ FieldResolver ( )
averageRating ( @ Root ( ) recipe : Recipe ) {
return recipe . ratings . reduce ( ( a , b ) => a + b , 0 ) / recipe . ratings . length ;
}
}И таким простым способом мы получаем эту часть схемы в SDL:
type Query {
recipes : [ Recipe ! ] !
}
type Mutation {
removeRecipe ( id : String ! ): Boolean !
}Мы все знаем, что GraphQL великолепен, и решает много проблем, которые у нас есть с помощью API REST, таких как чрезмерное извлечение и недостаточное количество. Но разработка API GraphQL в node.js с TypeScript иногда является чем -то вроде боли. Почему? Давайте посмотрим на шаги, которые мы обычно должны предпринять.
Во -первых, мы создаем все типы graphQL в schema.graphql с использованием SDL. Затем мы создаем наши модели данных, используя классы ORM, которые представляют наши сущности БД. Затем мы начинаем писать резолюры для наших запросов, мутаций и полей, но это заставляет нас сначала создавать интерфейсы TS для всех аргументов, входов и даже типов объектов.
Только тогда мы можем реализовать резолюры с использованием странных общих подписей и вручную выполнять общие задачи, такие как валидация, авторизация и загрузка зависимостей:
export const getRecipesResolver : GraphQLFieldResolver < void , Context , GetRecipesArgs > = async (
_ ,
args ,
ctx ,
) => {
// common tasks repeatable for almost every resolver
const repository = TypeORM . getRepository ( Recipe ) ;
const auth = Container . get ( AuthService ) ;
await joi . validate ( getRecipesSchema , args ) ;
if ( ! auth . check ( ctx . user ) ) {
throw new NotAuthorizedError ( ) ;
}
// our business logic, e.g.:
return repository . find ( { skip : args . offset , take : args . limit } ) ;
} ;Самая большая проблема - избыточность в нашей кодовой базе, которая затрудняет сохранение синхронизации. Чтобы добавить новое поле в нашу сущность, мы должны прыгнуть через все файлы - изменить класс объектов, схемы, а также интерфейс. То же самое касается входов или аргументов. Легко забыть обновить одну часть или допустить ошибку с одним типом. Кроме того, что, если мы сделали опечатку в имени поля? Функция переименования (F2) не будет работать правильно.
Инструменты, такие как GraphQL Code Generator или GraphQlGen, только решают первую часть-они генерируют соответствующие интерфейсы (и скелеты резолюров) для нашей схемы GraphQL, но они не исправляют схему <-> модели избыточности и опыт разработчиков (переименование F2 не сработает, вы должны помнить о задаче CodeGen Watch на фоне и т. Д.), А также общие тарифы, такие как валидация, авторизация и т. Д. И.
TypeGraphQL приходит к решению этих проблем, основанных на опыте нескольких лет разработки API GraphQL в TypeScript. Основная идея состоит в том, чтобы иметь только один источник истины, определяя схему, используя классы и некоторую помощь от декораторов. Дополнительные функции, такие как инъекция зависимостей, проверка и авторитетные охранники, помогают с общими задачами, которые обычно нам приходится справиться с самим собой.
Документация, руководство по установке и подробное описание API и всех его функций доступны на веб -сайте.
Полное начало работы с простым проходом (учебник) можно найти при начале работы DOCS.
Если вы предпочитаете видеоуроки, вы можете посмотреть сериал Ben Awad TypeGraphQL на YouTube.
Вы также можете проверить папку «Примеры» в этом репозитории для получения дополнительных примеров использования: Простые поля разрешаются, поддержка контейнеров DI, интеграция типов, автоматическая проверка и т. Д.
Папка Tests также может дать вам несколько советов о том, как сделать различные вещи.
Чтобы сообщить об уязвимости безопасности, пожалуйста, используйте контакт с безопасностью TIDELIFT. Tidelift будет координировать исправление и раскрытие.
В настоящее время выпущенная версия - это стабильный выпуск 1.0.0. Он хорошо проверяется (охват 97%, ~ 500 тестовых случаев) и имеет большинство запланированных функций, уже реализованных. Многие компании и независимые разработчики используют его в производстве с успехом.
Тем не менее, существуют также планы по гораздо большему количеству функций, таких как лучшая интеграция TypeMorm, Prisma и DataLoader, пользовательские декораторы и поддержку аннотаций метаданных - полный список идей доступен на Github Repo. Вы также можете отслеживать прогресс в разработке в совете проектов.
Если у вас есть какие -либо интересные запросы на функции, не стесняйтесь открывать проблему на GitHub, чтобы мы могли обсудить это!
TypeGraphQL -это лицензированный MIT-лицензированный проект с открытым исходным кодом. Эта структура является результатом огромного количества работы - бессонных ночей, занятых вечеров и выходных.
У него нет большой компании, которая сидит за ней - ее постоянное развитие возможно только благодаря поддержке сообщества.
Пожалуйста, попросите вашу компанию поддержать этот проект с открытым исходным кодом, став золотым спонсором и получив техническую поддержку премиум -класса от наших основных участников.