2017-07-13 2 views
1

graphqlのネストされた型の解決に問題があります。私は成功してUserMetricsネストされたリゾルバを起動させることができますが、親リゾルバオブジェクト(ユーザ)はnullです。 GraphQLリゾルバマップを誤解していますか?GraphQLでネストされた型を解決するには?

スキーマ:

type User { 
    id: String! 
    metrics: UserMetrics 
} 

type UserMetrics { 
    lastLogin: String! 
} 

リゾルバ:

Query: { 
    user(_, { id }, ctx) { 
     return { id }; 
    } 
}, 

User: { 
    metrics(): ({}), // UserMetrics.lastLogin doesn't fire without this 
}, 

UserMetrics: { 
    lastLogin(user) { 
     console.log(user); // null 
    } 
}, 
+0

また、提供したサンプルにはタイプミスがあります。 'metrics()=>({}) 'は、構文エラー –

+0

をスローします。編集しました。 –

答えて

5

これは周りにあなたの頭をラップには少し混乱することができ、そして残念ながらドキュメントは、ネストされたタイプがどのように動作するかの固体の例を提供していません。 。ドキュメントによると、リゾルバがかかる最初の引数は次のとおりです。

ので 親フィールド上のリゾルバから返された結果を含むオブジェクト、親(ユーザー)は、特定の解決しますフィールド(メトリック)。 このフィールドがスカラーの場合は、何もする必要はなく、それが返されます。 それ以外の場合は解決された親の値は、「子」タイプ(UserMetrics)に関連付けられたリゾルバに渡されます。それらのリゾルバはそれぞれ、その値を使用して、それが担当するフィールドを解決します。

ご指定のコードでは、Userは、空のオブジェクト(つまり{})としてmetricsを解決しています。これは、UserMetrics内の任意のフィールドのリゾルバに渡される値です。厳密に言えば、この場合、その値でconsole.logを実行すると、nullではなく{}が返されます。

これを試してください:metricsフィールドのリゾルバをコメントアウトし、{ id }の代わりに{ id, metrics: { lastLogin: 'foo' }}を返してください。これを実行すると、lastLogin(この場合は{ lastLogin: 'foo' })のリゾルバに渡されたオブジェクトを示すコンソール出力が表示されます。ここで起こっているステップ、によって

ステップ:

  1. クエリのuserフィールドはに解決され、{ID: 'whateverIdYouProvided'、メトリック:{lastLogin: 'FOO'}}。スカラーではなくUserタイプを返すので、Userの中のどのフィールドでもこの値をリゾルバに渡します。
  2. idのようなフィールドには、この場合にリゾルバが指定されていないので、デフォルトリゾルバを使用します。これは受信したオブジェクトを調べ、フィールドの名前と一致するプロパティを見つけた場合は、そのプロパティの値に解決します。その名前でプロパティを見つけることができない場合、nullを返します。この場合、idはスカラーなので、 'whateverIdYouProvided'に解決され、これ以上進める必要はありません。
  3. metricsリゾルバをコメントアウトしたので、このフィールドもデフォルトのリゾルバを使用します。この場合、型(UserMetrics)に変換され、与えられたオブジェクトを調べ、metricsというプロパティを見つけてその値({ lastLogin: 'foo' })をUserMetrics内のフィールドのリゾルバに渡します。
  4. UserMetricsには、lastLoginというフィールドがあります。そのリゾルバは上記の値 - { lastLogin: 'foo' } - を受け取ります。ここでリゾルバを指定しないと、デフォルトのリゾルバが使用され、lastLoginという名前のプロパティを見つけてその値( 'foo')に解決します。カスタムリゾルバを提供している場合、これまでのように、あなたが返すもの(コードの場合はnull)に解決されることは明らかです。

lastLoginリゾルバがまったく呼び出されていない場合は、実際にそのフィールドをクエリに含めたことを確認してください。クエリに含まれていないフィールドは解決する必要がないため、リゾルバは呼び出されません。

関連する問題