Créez un schéma GraphQL et résolve avec dactylographie, en utilisant des classes et des décorateurs!
https://typegraphql.com
TypeGraphQL fait du développement des API GraphQL un processus agréable, c'est-à-dire en définissant le schéma en utilisant uniquement des classes et un peu de magie décoratrice.
Ainsi, pour créer des types comme le type d'objet ou le type d'entrée, nous utilisons une sorte de classe DTO. Par exemple, pour déclarer le type Recipe , nous créons simplement une classe et l'annovons avec des décorateurs:
@ ObjectType ( )
class Recipe {
@ Field ( type => ID )
id : string ;
@ Field ( )
title : string ;
@ Field ( type => [ Rate ] )
ratings : Rate [ ] ;
@ Field ( { nullable : true } )
averageRating ?: number ;
}Et nous obtenons la partie correspondante du schéma dans SDL:
type Recipe {
id : ID !
title : String !
ratings : [ Rate ! ] !
averageRating : Float
}Ensuite, nous pouvons créer des requêtes, des mutations et des résolveurs de champ. À cette fin, nous utilisons des classes de type contrôleur qui sont appelées «résolveurs» par convention. Nous pouvons également utiliser des fonctionnalités impressionnantes comme l'injection de dépendance et les gardes d'authentification:
@ 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 ;
}
}Et de cette manière simple, nous obtenons cette partie du schéma dans SDL:
type Query {
recipes : [ Recipe ! ] !
}
type Mutation {
removeRecipe ( id : String ! ): Boolean !
}Nous savons tous que GraphQL est génial et résout de nombreux problèmes que nous avons avec les API REST, comme la surclassement et la sous-tendre. Mais le développement d'une API GraphQL dans Node.js avec TypeScript est parfois un peu pénible. Pourquoi? Jetons un coup d'œil aux étapes que nous devons généralement prendre.
Tout d'abord, nous créons tous les types GraphQL dans schema.graphql à l'aide de SDL. Ensuite, nous créons nos modèles de données à l'aide de classes ORM, qui représentent nos entités DB. Ensuite, nous commençons à écrire des résolveurs pour nos requêtes, mutations et champs, mais cela nous oblige à créer d'abord des interfaces TS pour tous les arguments, entrées et même types d'objets.
Ce n'est qu'alors que nous pouvons implémenter les résolveurs en utilisant des signatures génériques étranges et en effectuant des tâches courantes manuelles, comme la validation, l'autorisation et les dépendances de chargement:
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 } ) ;
} ;Le plus gros problème est la redondance de notre base de code, ce qui rend difficile la synchronisation des choses. Pour ajouter un nouveau champ à notre entité, nous devons sauter à travers tous les fichiers - modifier une classe d'entité, le schéma, ainsi que l'interface. Il en va de même pour les entrées ou les arguments. Il est facile d'oublier de mettre à jour une pièce ou de faire une erreur avec un seul type. Et si nous avons fait une faute de frappe dans le nom du champ? La fonction de renommée (F2) ne fonctionnera pas correctement.
Des outils tels que GraphQL Code Generator ou GraphQlGen résolvent uniquement la première partie - ils génèrent les interfaces (et résolvent les squelettes) correspondants pour notre schéma GraphQL mais ils ne corrigent pas le schéma <-> Modèles de redondance et l'expérience du développeur (F2 Rename ne fonctionnera pas comme une vaillance, une autorité, etc.
TypeGraphQL vient résoudre ces problèmes, en fonction de l'expérience de quelques années de développement d'API GraphQL dans TypeScript. L'idée principale est d'avoir une seule source de vérité en définissant le schéma en utilisant des classes et une aide des décorateurs. Des fonctionnalités supplémentaires telles que l'injection de dépendance, la validation et les gardes d'authentification aident les tâches courantes que normalement, nous devions nous gérer.
La documentation, le guide d'installation et la description détaillée de l'API et toutes ses fonctionnalités sont disponibles sur le site Web.
Un guide complet de démarrage avec une simple procédure pas à pas (tutoriel) peut être trouvé dans le démarrage des documents.
Si vous préférez les tutoriels vidéo, vous pouvez regarder la série vidéo TypeGraphQL de Ben Awad sur YouTube.
Vous pouvez également vérifier le dossier Exemples de ce référentiel pour plus d'exemples d'utilisation: Resolveurs de champs simples, support DI Container, intégration Typeorm, validation automatique, etc.
Le dossier des tests peut également vous donner quelques conseils sur la façon de faire diverses choses.
Pour signaler une vulnérabilité de sécurité, veuillez utiliser le contact de sécurité Tidelift. Tidelift coordonnera le correctif et la divulgation.
La version actuellement publiée est une version stable 1.0.0. Il est bien testé (couverture de 97%, ~ 500 cas de test) et a déjà mis en œuvre la plupart des fonctionnalités prévues. De nombreuses entreprises et développeurs indépendants l'utilisent en production avec succès.
Cependant, il existe également des plans pour beaucoup plus de fonctionnalités telles que Better Typeorm, Prisma et Dataloader Intégration, les décorateurs personnalisés et le support d'annotations de métadonnées - la liste complète des idées est disponible sur le repo GitHub. Vous pouvez également garder une trace des progrès du développement au sein de la carte de projet.
Si vous avez des demandes de fonctionnalités intéressantes, n'hésitez pas à ouvrir un problème sur GitHub afin que nous puissions en discuter!
TypeGraphQL est un projet open-source sous licence MIT. Ce cadre est le résultat de l'énorme quantité de travail - nuits blanches, soirées et week-ends occupés.
Il n'a pas une grande entreprise qui se trouve derrière elle - son développement continu n'est possible que grâce au soutien de la communauté.
Veuillez demander à votre entreprise de soutenir ce projet open source en devenant un sponsor d'or et en obtenant un support technique premium de nos contributeurs principaux.