2

Durch die Verwendung von graphql-js erstellen, müssen I durch Iterieren über Array von einigen Daten, beispielsweise graphql Schema dynamisch erstellen:Dynamically graphql Schema mit zirkulären Referenzen

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

Das Problem ist, zirkuläre Referenzen. Wenn ich AuthorType erstelle, muss BookType bereits erstellt sein und umgekehrt.

So sollte resultierende Schema wie folgt aussehen:

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

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

Wie kann ich dieses Problem lösen?

+1

Es gibt viele Seiten zu diesem Thema. Haben Sie nach etwas gesucht? Hier ist ein [Beispiel] (https://gist.github.com/xicombd/77406c29ddf37fe46c3c). –

+0

Verwenden Sie ein Feldconfigmapthunk http://graphql.org/docs/api-reference-type-system/ – vbranden

Antwort

5

aus offiziellen Dokumentation Zitiert

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

Wenn zwei Arten miteinander beziehen müssen, oder eine Art braucht sich in einem Feld zu beziehen, können Sie eine Funktion Ausdruck verwenden (auch bekannt als eine Schließung oder ein Thunk), um die Felder träge zu liefern.

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 }, 
    }) 
}); 

Schauen Sie auch bei diesem Stand der answer von Kreis Kategorie-Untertypen

+0

Diese Antwort ist fast richtig, es ist wahr, dass Sie Funktionsausdruck verwenden müssen. Außerdem müssen Sie Ihre Daten zweimal durchlaufen. In der ersten Iteration erstellen Sie alle Typen, aber die Felderfunktion gibt Links auf leere Objekte zurück. Und in der zweiten Literatur müssen Sie diese leeren Objekte mit tatsächlichen Daten füllen –

0

ich dieses Problem gelöst, indem ein Thunk für die Felder Feld.

const User = new GraphQLObjectType({ 
    name: 'User', 
    fields:() => ({ 
    id: { type: GraphQLID } 
    }) 
}); 

Wenn Sie Ihre Felder ein Thunk anstatt ein Objektliteral machen können Sie Typen verwenden, die später in der Datei definiert werden.

Bitte beachten Sie diesen Beitrag für weitere Informationen Is there a way to avoid circular type dependencies in GraqhQL?

auf diesem Posten Basierend Ich denke, das ist der richtige Weg, es zu tun.

Verwandte Themen