Apollo-link-rest: [ヘルプが必要]動的オブジェクトキーが存在する応答を含むクエリ

作成日 2020年07月03日  ·  4コメント  ·  ソース: apollographql/apollo-link-rest

Salesforceスキーマデータをリクエストしています。 それはフォーマットを持っています

res = {
  Id: { name, type, label },
  IsDeleted: { type, name, label },
  MasterRecordId: { type, name, label },
 ...and so on
}

したがって、フィールドは動的です。

querys.jsで私はそれを説明しようとしています

export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
       // What should be here??
   }
  }
`;
`

動的部分をどのように説明できますか? スキーマファイルやリゾルバーがありません。 querys.js(useQueryを使用した追加のリクエスト用)とclient.js(新しいApolloClientが定義されている場所)のみ

"@ apollo / client": "^ 3.0.0-rc.10"、
"apollo-link-rest": "^ 0.8.0-beta.0"、

question❔

全てのコメント4件

@ ssuvorov-ネットワーク呼び出しが正常に行われていることを確認しましたか?

もしそうなら、あなたの例の応答だけに基づいて:私は次のようなことをします:

export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
       Id {
         type, name, label
       }
       IsDeleted {
         type, name, label
       }
       # …remaining fields
   }
  }
`;

--GraphQLはすべての型に名前が付いていることを想定しているため、これは機能しない可能性があります。代わりに、次のように変更する必要があります。

export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
-      Id {
+      Id @type(name: "FieldDescriptor") {
         type, name, label
       }
-      IsDeleted {
+      IsDeleted @type(name: "FieldDescriptor") {
         type, name, label
       }
       # …remaining fields
   }
  }
`;

(これを行う別の方法は、TypePatcherを使用することです-ドキュメントに記載されています)

すべてのエントリが同じオブジェクトスキーマである場合は、フラグメントを使用して次のことを行うこともできます。

export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
       Id @type(name: "FieldDescriptor") {
-          type, name, label
+          ...FieldFrag
       }
       IsDeleted @type(name: "FieldDescriptor") {
-          type, name, label
+          ...FieldFrag
       }
       # …remaining fields
   }
+ fragment FieldFrag on FieldDescriptor {
+    type
+    name
+    label
+ }
 }`;

Salesforceを一般的な方法で使用していて、列の数がわからない場合は、少し複雑になり、タイプパッチャーを使用しての形状を変更する必要があります。 API。

私はSalesforceを使用していませんが、私である場合は、Salesforceの担当者に、公式のGraphQLオファリングがあるかどうか、またはそれをネイティブに取得するための祝福されたサードパーティオファリングがあるかどうかを尋ねることを検討します。

簡単なグーグル検索はこれが存在することを示しました: httpsa0N3A00000G0l6nUAB-しかしそれは1つのレビューしかないので、それが何か良いかどうかはわかりません。

@fbarthoお返事ありがとうございます。 残念ながら、それは500以上のフィールドです。 さて、SFチームと一緒に明確にしようと思います。

それを少し簡単にするために応答を処理する必要がある場合は、typenamePatcher を使用できます。これは、応答を完全に再形成するためのフックを提供します。

より良い/より一般的なスキーマは、事実上次のようになります。

type MyResponse (
  columns: [Column!]!
}
type Column {
  name: String!
  type: String!
  label: String!
}

@fbarthoご協力いただきありがとうございます。 これが私がそれを解決した方法です。

// queries.js
export const GET_SALESFORCE_FIELDS = gql`
  query SalesforceFields {
    salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFieldsPayload", path: "/fields") {
      items @type(name: "Salesforce")
    }
  }
`;

// client.js
const restLink = new RestLink({
  ...,
  typePatcher: {
    SalesforceFieldsPayload: (
      data,
      outerType,
      patchDeeper
    ) => {
      if (data != null) {
        data.items = Object.keys(data).map(field => ({ __typename: "Salesforce", ...data[field] }));
      }
      return data;
    }
  }
});
このページは役に立ちましたか?
0 / 5 - 0 評価