Apollo-link-rest: [مطلوب مساعدة] استعلام مع استجابة حيث توجد مفاتيح الكائنات الديناميكية

تم إنشاؤها على ٣ يوليو ٢٠٢٠  ·  4تعليقات  ·  مصدر: apollographql/apollo-link-rest

أنا أطلب بيانات مخطط Salesforce. لها شكل

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

لذلك ، الحقول ديناميكية.

في queries.js أحاول وصفها

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

كيف يمكنني وصف الجزء الديناميكي؟ ليس لدي أي ملفات مخطط أو أدوات حل. فقط queries.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 رسميًا ، أو إذا كان لديهم عرضًا مباركًا من جهة خارجية للحصول عليه محليًا.

أظهر بحث سريع في google أن هذا موجود: https://appexchange.salesforce.com/appxListingDetail؟listingId=a0N3A00000G0l6nUAB - ولكن ليس لديه سوى مراجعة واحدة ، لذلك ليس لدي أي فكرة عما إذا كان جيدًا.

fbartho شكرا جزيلا

إذا كنت بحاجة إلى معالجة استجابة لجعل ذلك أسهل قليلاً ، فيمكنك استخدام نوع نوع باتشر ، والذي سيعطيك رابطًا لإعادة تشكيل الاستجابة بالكامل.

قد يبدو المخطط الأفضل / الأكثر عمومية كما يلي:

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 التقييمات