2

とgraphqlスキーマを作成し、私は、例えば、いくつかのデータの配列を反復することによって動的にgraphqlスキーマを作成する必要がありますが動的graphql-JSを使用することにより、循環参照

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

問題が循環参照です。私がAuthorTypeを作成するとき、BookTypeが既に作成されている必要があります。

だから、結果スキーマは、次のようになります。

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

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

どのように私はこの問題を解決することができますか?

+1

この問題に関しては、多くのページがあります。何かを探しましたか? [例](https://gist.github.com/xicombd/77406c29ddf37fe46c3c)です。 –

+0

fieldconfigmapthunkを使用するhttp://graphql.org/docs/api-reference-type-system/ – vbranden

答えて

5
公式ドキュメントから引用

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

2種類が相互に参照する必要がある、またはタイプがフィールドに自分自身を を参照する必要があるときは、関数式(別名を使用することができますクロージャ またはサンク)を使用して、フィールドを遅延させます。

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

また、円形のカテゴリー-サブカテゴリ種類のこの関連answer

+0

この回答はほぼ正しいですが、関数式を使用する必要があります。さらに、データを2回反復処理する必要があります。最初の反復ではすべての型を作成していますが、fields関数は空のオブジェクトにリンクを返します。 2番目の小売では、空のオブジェクトに実際のデータを入力する必要があります –

0

を見て、私はフィールドのフィールドにサンクを使用することによって、この問題を解決しました。

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

オブジェクトリテラルではなくサンクを使用すると、後でファイルで定義される型を使用できます。

私は、これはそれを行うための正しい方法だと思うそのポストに基づいて詳細Is there a way to avoid circular type dependencies in GraqhQL?

のため、この記事を参照してください。