


Pourquoi devriez-vous éviter les méthodes utilitaires dans les résolveurs GraphQL
GraphQL a révolutionné la façon dont nous récupérons et façonnons les données, en fournissant une couche d'abstraction propre entre les clients et les serveurs. L'une de ses fonctionnalités principales, les résolveurs, nous permet de définir comment chaque champ de notre schéma obtient ses données. Dans certains cas, les développeurs peuvent involontairement diminuer les avantages de GraphQL en s'appuyant sur des méthodes utilitaires dans les résolveurs. Cette pratique va non seulement à l'encontre de l'objectif de la conception de GraphQL, mais introduit également une complexité inutile et des bogues potentiels.
Voyons pourquoi cela pose problème et comment faire mieux.
Le pouvoir des résolveurs
Dans GraphQL, les résolveurs sont invoqués pour chaque instance d'un type, quel que soit l'endroit où ce type apparaît dans votre schéma. Cette abstraction garantit que la logique de résolution des données reste cohérente à tous les niveaux. Par exemple :
schema { query: Query } type Query { project(id: ID!): Project user(id: ID!): User } type Project { id: ID! name: String! owner: User! } type User { id: ID! name: String! email: String! }
Ici, le type Utilisateur est utilisé à deux endroits : directement dans la requête pour récupérer les utilisateurs et imbriqué dans le type Projet en tant que propriétaire. Grâce au système de résolution de GraphQL, nous pouvons définir un seul résolveur d'utilisateur pour gérer la façon dont les champs d'utilisateur sont résolus, garantissant ainsi un comportement cohérent partout où l'utilisateur apparaît.
Le problème avec les utilitaires
Lorsque vous introduisez des méthodes utilitaires pour façonner les données en dehors de vos résolveurs, vous brisez cette abstraction. Prenons cet exemple :
// utils.ts function mapToUser(userData: DataSourceUser) { return { id: userData.id, name: userData.full_name, email: userData.contact_email, }; } // resolvers.ts const resolvers: Resolvers<Context> = { Query: { project: async (_, { id }, { dataSources }) => { const project = await dataSources.projectAPI.getProject(id); return { ...project, owner: mapToUser(project.owner), // Utility method called here }; }, user: async (_, { id }, { dataSources }) => { const user = await dataSources.userAPI.getUser(id); return mapToUser(user); // Utility method called here }, }, };
À première vue, cela peut sembler bien. Mais voici pourquoi c'est problématique :
1. Logique dupliquée
Vous êtes obligé d'appeler mapToUser dans chaque résolveur où un type d'utilisateur apparaît. Oublier de l'appeler ou l'appeler de manière incorrecte peut entraîner un comportement incohérent au sein de votre API.
2. Briser l'abstraction
Le système de résolution de GraphQL est conçu pour centraliser la façon dont chaque type est résolu. En utilisant une méthode utilitaire, vous contournez cette fonctionnalité et rendez votre code moins intuitif.
3. Perte de flexibilité
Si jamais vous devez modifier la façon dont un type d'utilisateur est résolu (par exemple, en ajoutant de nouveaux champs ou en traitant des erreurs), vous devrez rechercher chaque endroit où mapToUser est appelé au lieu de mettre à jour un seul résolveur.
La meilleure approche : exploiter les résolveurs de types
Au lieu d'utiliser des méthodes utilitaires, définissez des résolveurs pour vos types GraphQL. Voici comment vous pouvez réécrire l'exemple ci-dessus :
schema { query: Query } type Query { project(id: ID!): Project user(id: ID!): User } type Project { id: ID! name: String! owner: User! } type User { id: ID! name: String! email: String! }
Pourquoi c'est mieux
- Cohérence : le résolveur d'utilisateur garantit que toutes les instances d'utilisateur sont résolues de la même manière, quel que soit leur emplacement dans le schéma.
- Logique centralisée : les modifications apportées à la façon dont un utilisateur est résolu ne doivent être apportées qu'à un seul endroit.
- Exploiter les points forts de GraphQL : en adoptant le système de résolution, vous vous alignez sur les principes de conception fondamentaux de GraphQL et exploitez tout son potentiel.
Conclusion
L'utilisation de méthodes utilitaires dans vos résolveurs peut sembler un raccourci, mais cela compromet finalement la puissance et l'élégance de GraphQL. En définissant des résolveurs pour vos types, vous pouvez conserver une API propre, cohérente et évolutive. Alors arrêtez d'utiliser des utilitaires dans vos résolveurs et adoptez l'abstraction fournie par GraphQL : votre futur vous vous en remerciera !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











JavaScript est la pierre angulaire du développement Web moderne, et ses principales fonctions incluent la programmation axée sur les événements, la génération de contenu dynamique et la programmation asynchrone. 1) La programmation axée sur les événements permet aux pages Web de changer dynamiquement en fonction des opérations utilisateur. 2) La génération de contenu dynamique permet d'ajuster le contenu de la page en fonction des conditions. 3) La programmation asynchrone garantit que l'interface utilisateur n'est pas bloquée. JavaScript est largement utilisé dans l'interaction Web, les applications à une page et le développement côté serveur, améliorant considérablement la flexibilité de l'expérience utilisateur et du développement multiplateforme.

Les dernières tendances de JavaScript incluent la montée en puissance de TypeScript, la popularité des frameworks et bibliothèques modernes et l'application de WebAssembly. Les prospects futurs couvrent des systèmes de type plus puissants, le développement du JavaScript côté serveur, l'expansion de l'intelligence artificielle et de l'apprentissage automatique, et le potentiel de l'informatique IoT et Edge.

Différents moteurs JavaScript ont des effets différents lors de l'analyse et de l'exécution du code JavaScript, car les principes d'implémentation et les stratégies d'optimisation de chaque moteur diffèrent. 1. Analyse lexicale: convertir le code source en unité lexicale. 2. Analyse de la grammaire: générer un arbre de syntaxe abstrait. 3. Optimisation et compilation: générer du code machine via le compilateur JIT. 4. Exécuter: Exécutez le code machine. Le moteur V8 optimise grâce à une compilation instantanée et à une classe cachée, SpiderMonkey utilise un système d'inférence de type, résultant en différentes performances de performances sur le même code.

JavaScript est le langage central du développement Web moderne et est largement utilisé pour sa diversité et sa flexibilité. 1) Développement frontal: construire des pages Web dynamiques et des applications à une seule page via les opérations DOM et les cadres modernes (tels que React, Vue.js, Angular). 2) Développement côté serveur: Node.js utilise un modèle d'E / S non bloquant pour gérer une concurrence élevée et des applications en temps réel. 3) Développement des applications mobiles et de bureau: le développement de la plate-forme multiplateuse est réalisé par réact noral et électron pour améliorer l'efficacité du développement.

Python convient plus aux débutants, avec une courbe d'apprentissage en douceur et une syntaxe concise; JavaScript convient au développement frontal, avec une courbe d'apprentissage abrupte et une syntaxe flexible. 1. La syntaxe Python est intuitive et adaptée à la science des données et au développement back-end. 2. JavaScript est flexible et largement utilisé dans la programmation frontale et côté serveur.

Cet article démontre l'intégration frontale avec un backend sécurisé par permis, construisant une application fonctionnelle EdTech SaaS en utilisant Next.js. Le frontend récupère les autorisations des utilisateurs pour contrôler la visibilité de l'interface utilisateur et garantit que les demandes d'API adhèrent à la base de rôles

Le passage de C / C à JavaScript nécessite de s'adapter à la frappe dynamique, à la collecte des ordures et à la programmation asynchrone. 1) C / C est un langage dactylographié statiquement qui nécessite une gestion manuelle de la mémoire, tandis que JavaScript est dynamiquement typé et que la collecte des déchets est automatiquement traitée. 2) C / C doit être compilé en code machine, tandis que JavaScript est une langue interprétée. 3) JavaScript introduit des concepts tels que les fermetures, les chaînes de prototypes et la promesse, ce qui améliore la flexibilité et les capacités de programmation asynchrones.

J'ai construit une application SAAS multi-locataire fonctionnelle (une application EdTech) avec votre outil technologique quotidien et vous pouvez faire de même. Premièrement, qu'est-ce qu'une application SaaS multi-locataire? Les applications saas multi-locataires vous permettent de servir plusieurs clients à partir d'un chant
