2

En utilisant graphql-js, je dois créer le schéma graphql dynamiquement par itérer sur tableau de certaines données, par exemple:création Dynamiquement schéma graphql avec des références circulaires

[{ 
    name: 'author', 
    fields: [{ 
     field: 'name' 
    }, { 
     field: 'books', 
     reference: 'book' 
    }] 
}, { 
    name: 'book', 
    fields: [{ 
     field: 'title' 
    }, { 
     field: 'author', 
     reference: 'author' 
    }] 
}] 

Le problème est des références circulaires. Lorsque je crée AuthorType, j'ai besoin que BookType soit déjà créé et vice versa.

Alors schéma obtenu devrait ressembler à:

type Author : Object { 
    id: ID! 
    name: String, 
    books: [Book] 
} 

type Book : Object { 
    id: ID! 
    title: String 
    author: Author 
} 

Comment puis-je résoudre ce problème?

+1

Il existe de nombreuses pages concernant ce problème. Avez-vous cherché? Voici un [exemple] (https://gist.github.com/xicombd/77406c29ddf37fe46c3c). –

+0

Utilisez un champconfigmapthunk http://graphql.org/docs/api-reference-type-system/ – vbranden

Répondre

5

Cité de la documentation officielle

http://graphql.org/docs/api-reference-type-system/

Lorsque deux types doivent se référer les uns aux autres, ou un type a besoin de se référer à lui-même dans un champ, vous pouvez utiliser une expression de fonction (alias une fermeture ou un thunk) pour alimenter les champs paresseusement.

var AddressType = new GraphQLObjectType({ 
    name: 'Address', 
    fields: { 
    street: { type: GraphQLString }, 
    number: { type: GraphQLInt }, 
    formatted: { 
     type: GraphQLString, 
     resolve(obj) { 
     return obj.number + ' ' + obj.street 
     } 
    } 
    } 
}); 

var PersonType = new GraphQLObjectType({ 
    name: 'Person', 
    fields:() => ({ 
    name: { type: GraphQLString }, 
    bestFriend: { type: PersonType }, 
    }) 
}); 

Regardez aussi ce answer connexe de types circulaires Catégorie-Sous-catégorie

+0

Cette réponse est presque correcte, il est vrai que vous devez utiliser l'expression de la fonction. En outre, vous devez parcourir deux fois vos données. Dans la première itération, vous créez tous les types mais la fonction champs renvoie des liens sur des objets vides. Et en deuxième lecture, vous devez remplir ces objets vides avec des données réelles –

0

Je résolu ce problème en utilisant un thunk pour le champ des champs. Lorsque vous faites de vos champs un thunk plutôt qu'un littéral d'objet, vous pouvez utiliser les types définis plus tard dans le fichier.

S'il vous plaît voir cet article pour plus d'informations Is there a way to avoid circular type dependencies in GraqhQL?

Sur la base de ce poste, je pense que c'est la bonne façon de le faire.