2016-05-22 9 views
11

viewerがRelay.jsで正しく使用される必要があり、その使い方は何ですか?Relay.jsのビューア

私は先週、Relay.jsを試して理解しました。今はGraphQLでうまくいきましたが、私はそれをよく理解していますが、同じアプリケーションでGraphQLとRelay.jsを結合することにいくつかの問題があります。

最初の手順はおそらくviewerを理解することです。私はそれを使って多くの例とチュートリアルを見たことがありますが、それは決して説明されていません。正確に何が使用されているのかは明確ではありません。

リレー・マニュアルには「viewer」と書かれていますが、説明する単語は1つではありません。

私はこの質問にもっと何かできることを望みますが、私はオンラインで説明がないことを恐れています。それはコードでのみ使用され、コンテキストからそれをリッピングすることは意味をなさないでしょう。この質問に答えるには、とにかくRealy.js/GraphQLに関する知識が必要です。

私が検討した無数の例に基づいて私の最高の推測は、何とかユーザーに関係しているということですか?ユーザーが匿名でログインしている場合ログインステータスやユーザーレベルに基づいてデータに異なるアクセスを許可するには?

答えて

8

viewerは、リレー固有のものではありません。それは単なるフィールド名です。あなたはリハートです。このフィールドは通常、アプリケーションのユーザーまたはビューアのGraphQLObject型を表します。

ルートクエリタイプは、定義し、スキーマオブジェクト内にqueryとして渡すGraphQLオブジェクトです。たとえば、todo example applicationでは、Rootです。 relay-treasurehunt example application

export const schema = new GraphQLSchema({ 
    query: Root, 
    mutation: Mutation, 
}); 

、ルートクエリータイプqueryTypeあります。

export const schema = new GraphQLSchema({ 
    query: queryType, 
    mutation: mutationType, 
}); 

ルートクエリタイプは、他のデータにアクセスするプライマリアクセスポイントです。これらの他のデータは、ルートクエリオブジェクトのフィールドとしてリストされます。任意のGraphQLオブジェクトと同様に、ルートクエリタイプは1つ以上のフィールドを持つことができます。 TODOのサンプルアプリケーションでは、それはviewerという名前のフィールドがあります。リレーtreasurehunt応用例で

const Root = new GraphQLObjectType({ 
    name: 'Root', 
    fields: { 
    viewer: { 
     type: GraphQLUser, 
     resolve:() => getViewer(), 
    }, 
    node: nodeField, 
    }, 
}); 

を、ルートクエリのタイプはgameという名前のフィールドがあります。

const queryType = new GraphQLObjectType({ 
    name: 'Query', 
    fields:() => ({ 
    node: nodeField, 
    game: { 
     type: gameType, 
     resolve:() => getGame(), 
    }, 
    }), 
}); 

は今、完全にアプリケーションに依存して、ユーザーが匿名または記録されているかどうか、アプリケーションユーザまたはWebサイトビューアを表現するviewerフィールドがある場合。ユーザーがログインする必要がある場合は、ログイン用に突然変異を実装することができます。データへのアクセスを制限することもできます。 Jonas Helferは、サーバー側でユーザーアクセスチェックを実行する方法にexcellent answerと表示されます。