2015-12-02 10 views
13

私はRelayに慣れていて、まだ私の頭を包み込んでいます。私の理解に基づいて、リレーはコンポーネントにクエリを関連付けます。このようにして、GraphQLサーバからコンポーネントをx、y、zで提供する必要があると言えます。私の理解に基づいて、正規のreact-relayライブラリは、コンポーネントがレンダリングされようとしているときに、適切なタイミングでこれらのクエリをディスパッチします。アドホッククエリをディスパッチするには、リレーを使用しますか?

これは、単純にデータのリストを表示するなど、まっすぐ進む使用の場合には意味があります。

しかし、どうやってやっているのか混乱しているのは、コンポーネントに結びついているもののカテゴリにはあまり入らないクエリをディスパッチする方法です。ユーザー認証セッショントークンなどを取得しようとするクエリなど。これは私の現在の状況です:私はGraphQLからセッショントークンをフェッチするフォームでユーザーサインを作成しようとしています。私はユーザ名とパスワードの引数を必要とするパラメータ化されたGraphQLフィールドを持っており、セッショントークンが有効であればそれを返します。 Relayを使用してそのセッショントークンを照会する方法はわかりません。

私は基本的にクエリをディスパッチし、レスポンスを処理するだけです(セッショントークンをReactアプリケーションの状態に置く)。

アイデア?

+0

私はあなたのQNへの応答を見ていないために、その失望の同様のQN https://stackoverflow.com/questions/34346273/search-functionality-using-relayを求めた後、これを見つけました。 cc @steveluscher – bsr

+2

明確な回答がないまま多くの質問と問題が発生した後、私はGraphQLとRelayを今すぐ削除することにしました。私はReduxと典型的なHTTP RESTful APIに戻りました。私はGraphQLとRelayで多くの良いものを見ていますが、臨機応変な質問(またはRelayでそのような種類の作業フローを行う方法)やユーザー認証タイプのものなど、あまりにも多くの質問があります誰。特定のフィールドを許可を得てユーザーに表示することを処理するには、サーバーとクライアント側のコードがあまりにも多く必要になりました。しかし、私は他のすべてが本当に好きだった。 – Ryan

+0

お返事ありがとうございます。 – bsr

答えて

20

リレーのAPIは主に、コンポーネントのデータを簡単に取得できるようにすることに重点を置いていますが、リレーはアドホッククエリもサポートしています。 APIは比較的低レベルで、データの取得と読み取りのための別個の機能を備えています。ここでは、アドホッククエリを取得し、応答にアクセスする方法の例です:

// Create a query with values for any variables: 
var query = Relay.createQuery(Relay.QL`query ... `, {var: 'value'}); 
// Fetch any fields that have not yet been cached: 
Relay.Store.primeCache({query}, readyState => { 
    if (readyState.done) { 
    // When all data is ready, read the data from the cache: 
    var data = Relay.Store.readQuery(query)[0]; 
    /* access fields on `data` */ 
    } 
}); 

データがリレーのキャッシュと同期する必要がない場合、あなたはまた、フェッチ、XHR(プレーンネットワーク要求を使用することができますなど)を使用して、プレーンな文字列クエリをGraphQLエンドポイントに送信します。

+0

サーバーから最新のデータを確実に取得するには、Relay.Store.forceFetch({query}、readyStateCallback)を使用することもできます。 –

1

正直なところ、別のライブラリを使用するのが最も簡単です。私のnodeプロジェクトでLokkaを使用しています。これは単純で信頼性の高いものです。

// config 
const Lokka = require('lokka').Lokka; 
const Transport = require('lokka-transport-http').Transport; 

const client = new Lokka({ 
    transport: new Transport('http://graphql-swapi.parseapp.com/') 
}); 



// query 
client.query(` 
    { 
    allFilms { 
     films { 
     ...${filmInfo} 
     } 
    } 
    } 
`).then(result => { 
    console.log(result.allFilms.films); 
}); 
関連する問題