Apollo-link-rest: ماذا أفعل عندما يعرض الخادم نتيجة غير متوافقة مع Graphql

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

ما أحاول القيام به هو الاستعلام عن معلومات الحساب إلى عملة bcoin عبر واجهة http بقية.
للقيام بذلك ، لا بد لي

  1. اسأل عن أسماء جميع accountName عن طريق الاتصال بـ GET /wallet/:id/account
  2. اطلب تفاصيل الحساب بـ GET /wallet/:id/account/:accountName

المشكلة هي أن المكالمة الأولى سترجع شيئًا مثل ["default", "mySecondAccountName"]
والتي لا أعرف كيفية تحليلها كاستجابة للرسم البياني ، ولا تمريرها مباشرة إلى الدرجة الثانية 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 };
    }
  }
});

استخدام الاستعلام
شبيبة
يقدم - يجعل() {
إرجاع (
{({تحميل ، خطأ ، بيانات}) => {
إذا (تحميل) {
إرجاع (

تحميل...

) ؛
}

      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")
}

ثم تحصل على نتائج ذلك من البيانات وتمريرها إلى استعلام جديد يحصل على تفاصيل الحساب.

شكرا على الاستجابة اللطيفة والسريعة. تضمين التغريدة
ربما لم يكن عليّ أن أذكر bcoin ، مشكلتي أكثر بساطة

في مثال التوجيه @export في المستند ، يحتوي على مثال لاستدعاء نقطة نهاية REST مرتين .
سؤالي هو ، ماذا علي أن أفعل عندما يقوم الاستعلام الأول في هذا المثال بإرجاع مصفوفة من 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 .
لذلك يجب أن أحدد { theFieldNameIDesire } بعد السطر account ، المشكلة هي أنه ليس لدي اسم حقل لأحدده :(

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 };
    }
  }
});

استخدام الاستعلام
شبيبة
يقدم - يجعل() {
إرجاع (
{({تحميل ، خطأ ، بيانات}) => {
إذا (تحميل) {
إرجاع (

تحميل...

) ؛
}

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