Apollo-link-rest: サーバーがgraphqlに準拠していない結果を返した場合はどうすればよいですか

作成日 2018年06月20日  ·  6コメント  ·  ソース: apollographql/apollo-link-rest

私がやろうとしているのは、 httprestインターフェースを介してアカウント情報を
そうするために、私はしなければなりません

  1. すべての既存の名前を尋ねるaccountName呼び出すことにより、 GET /wallet/:id/account
  2. GET /wallet/:id/account/:accountNameでアカウントの詳細を尋ねる

問題は、最初の呼び出しが["default", "mySecondAccountName"]ようなものを返すことです
これをgraphql応答として解析する方法も、2番目のGET直接渡す方法もわかりません。

たとえば、次のクエリでクエリを実行しようとしたとき、

query (id: "primary") @rest(type: AccountName, path: "/wallet/:id/account") {
  default

Error: Network error: Cannot create property 'default' on string 'default'を受け取ります

ドキュメントに手がかりが見つかりませんでしたが、これは非常に一般的なケースのようであるため、非常に単純なものが欠落しているに違いありません。 誰かが私が何を探すべきかを私に指摘してくれたら本当に感謝しています

question❔

最も参考になるコメント

私はあなたが使うべきだと思う@joemphilips typePatcherを

私はそれを使用して、次のような非graphql準拠の応答を処理します

{
   "100": {
      "id": 100,
      "node_id": 105,
      "category_id": 8,
      "title": "Title 100",
      "highlight": true
   },
   "138": {
      "id": 138,
      "node_id": 106,
      "category_id": 7,
      "title": "Title 138",
      "highlight": false
   },
   "140": {
      "id": 140,
      "node_id": 101,
      "category_id": 9,
      "title": "Title 140",
      "highlight": false
   },
   "158": {
      "id": 158,
      "node_id": 146,
      "category_id": 4,
      "title": "Title 158",
      "highlight": false
   }
}

クエリ定義

import { gql } from 'apollo-boost';

export const GET_NEWS_QUERY = gql`
  query getNews {
    News @rest(type: "News", path: "news") {
      data
    }
  }
`;

RestLink構成

const restLink = new RestLink({
  uri: API_URL,
  typePatcher: {
    News: (data, outerType) => {
      if (outerType === 'News') {
        data = Object.keys(data).map(id => {
          const result = data[id];

          if (result) {
            return {
              __typename: 'News',
              ...result
            };
          }
        });
      }

      return { data };
    }
  }
});

クエリの使用法
`` `js
与える() {
戻る (
{({読み込み、エラー、データ})=> {
if(読み込み中){
戻る (

読み込んでいます...

);
}

      if (error) {
        return (
          <View>
            <Text>Error :(</Text>
          </View>
        );
      }

      const news = data && data.News && data.News.data;
      const filteredNews = news && news.filter(Boolean);

      return (
        <Styles.Container>
          <Carousel
            data={filteredNews}
            handleOnPress={this.navigateToScreen}
          />
        </Styles.Container>
      );
    }}
  </Query>
);

}
`

全てのコメント6件

私はbcoinに精通していないので推測しているだけですが、ここに提案があります:

query Account(id: $id){
   account(id: $id) @rest(type: "[String]", path: "/wallet/:id/account")
}

次に、データからその結果を取得し、アカウントの詳細を取得する新しいクエリに渡します。

親切で迅速な対応に感謝します。 @fbartho
たぶん私はbcoinに言及するべきではなかったでしょう、私の問題はもっと単純です

ドキュメントの@exportディレクティブの例では、RESTエンドポイントを2回呼び出す例があります
私の質問は、この例の最初のクエリがオブジェクトの配列ではなくScalarの配列を返す場合はどうすればよいですか?
キーがないため、エクスポートする引数を指定する方法がないようです。

また、 @exportを使用せずに、前述のようにクエリを実行しようとしましたが、フェッチの結果は{}
次の警告が表示されます

Missing field account in {}

ちなみに、私はあなたの提案で思います

query Account(id: $id)

する必要があります

query Account($id: id)

私があなたが提案したコマンドを実行すると、すなわち

query Account(id: $id){
   account(id: $id) @rest(type: "[String]", path: "/wallet/:id/account")
}

実際にはクエリを実行せず、 {}dataとして返すだけです。
したがって、 accountの行の後に{ theFieldNameIDesire }指定する必要があります。問題は、指定するフィールド名がないことです:(

私はあなたが使うべきだと思う@joemphilips typePatcherを

私はそれを使用して、次のような非graphql準拠の応答を処理します

{
   "100": {
      "id": 100,
      "node_id": 105,
      "category_id": 8,
      "title": "Title 100",
      "highlight": true
   },
   "138": {
      "id": 138,
      "node_id": 106,
      "category_id": 7,
      "title": "Title 138",
      "highlight": false
   },
   "140": {
      "id": 140,
      "node_id": 101,
      "category_id": 9,
      "title": "Title 140",
      "highlight": false
   },
   "158": {
      "id": 158,
      "node_id": 146,
      "category_id": 4,
      "title": "Title 158",
      "highlight": false
   }
}

クエリ定義

import { gql } from 'apollo-boost';

export const GET_NEWS_QUERY = gql`
  query getNews {
    News @rest(type: "News", path: "news") {
      data
    }
  }
`;

RestLink構成

const restLink = new RestLink({
  uri: API_URL,
  typePatcher: {
    News: (data, outerType) => {
      if (outerType === 'News') {
        data = Object.keys(data).map(id => {
          const result = data[id];

          if (result) {
            return {
              __typename: 'News',
              ...result
            };
          }
        });
      }

      return { data };
    }
  }
});

クエリの使用法
`` `js
与える() {
戻る (
{({読み込み、エラー、データ})=> {
if(読み込み中){
戻る (

読み込んでいます...

);
}

      if (error) {
        return (
          <View>
            <Text>Error :(</Text>
          </View>
        );
      }

      const news = data && data.News && data.News.data;
      const filteredNews = news && news.filter(Boolean);

      return (
        <Styles.Container>
          <Carousel
            data={filteredNews}
            handleOnPress={this.navigateToScreen}
          />
        </Styles.Container>
      );
    }}
  </Query>
);

}
`

返信が遅くなってすみません。 あなたの解決策は配列の文字列/スカラーでは機能しないようです。 しかし、それは修正されているようです。 もう一度やり直します。 そして、私が問題を抱え続けているならば、再開するかもしれません。 ありがとう。

このページは役に立ちましたか?
0 / 5 - 0 評価