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"、
@ 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オファリングがあるかどうか、またはそれをネイティブに取得するための祝福されたサードパーティオファリングがあるかどうかを尋ねることを検討します。
簡単なグーグル検索はこれが存在することを示しました: https : a0N3A00000G0l6nUAB-しかしそれは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;
}
}
});