Apollo-link: اصطياد الأخطاء باستخدام الروابط

تم إنشاؤها على ٢ نوفمبر ٢٠١٧  ·  5تعليقات  ·  مصدر: apollographql/apollo-link

يؤدي استخدام هذا المثال من الوثائق إلى استدعاء إحضار مرتين (الأولى عند الاشتراك والثانية في رابط http):

http://apollo-link-docs.netlify.com/docs/link/stateless.html

const reportErrors = (errorCallback) => new ApolloLink((operation, forward) => {
  const observer = forward(operation);
  // errors will be sent to the errorCallback
  observer.subscribe({ error: errorCallback })
  return observer;
});

//...

const createLinks = () =>
  ApolloLink.from([
    reportErrors(console.error),
    httpLink,
  ]);

يعمل على النحو المنشود وفقًا للمواصفات التي يمكن ملاحظتها. يجب استدعاء Producer fn عند أول مكالمة اشتراك. لكن ليس من الواضح ما هي الطريقة الصحيحة للتعامل مع الأخطاء مع httpLink ؟

لقد بحثت في الكود المصدري قليلاً وهناك طرق مثل map ، reduce إلخ ، لكن لا أحد منهم يقبل رد اتصال خطأ.

التعليق الأكثر فائدة

valerybugakov الق نظرة على رابط خطأ أبولو

قم بتكوين هذا باستخدام httpLink الخاص بك على النحو التالي:

import { ApolloClient } from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { createHttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import { InMemoryCache } from 'apollo-cache-inmemory';

const errorLink = onError(({ networkError, graphQLErrors }) => {
  if (graphQLErrors) {
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
      ),
    );
  }
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const httpLink = createHttpLink({ ... });

const link = ApolloLink.from([
  ...otherLinksIfNeeded,
  errorLink,
  httpLink,
]);

const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
  queryDeduplication: true,
});

ال 5 كومينتر

valerybugakov الق نظرة على رابط خطأ أبولو

قم بتكوين هذا باستخدام httpLink الخاص بك على النحو التالي:

import { ApolloClient } from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { createHttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import { InMemoryCache } from 'apollo-cache-inmemory';

const errorLink = onError(({ networkError, graphQLErrors }) => {
  if (graphQLErrors) {
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
      ),
    );
  }
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const httpLink = createHttpLink({ ... });

const link = ApolloLink.from([
  ...otherLinksIfNeeded,
  errorLink,
  httpLink,
]);

const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
  queryDeduplication: true,
});

somehandle نعم ، إنه خيار. ماذا لو كنت أرغب في معالجة الأخطاء في الارتباط المخصص الخاص بي؟ لقد وجدت أن الطريقة الوحيدة للقيام بذلك هي التفاف Observable الذي تم إرجاعه بواسطة next(operation) إلى Observable آخر.

valerybugakov ما نوع الأخطاء التي تريد معالجتها؟ إذا كانت أخطاء Graphql ، فيمكنك استخدام .map على نتيجة forward(operation) حيث يتم إرجاعها نتيجة لذلك ، إذا لم يكن الأمر كذلك ، فأنت بحاجة إلى الاشتراك حول المراقب الآخر. ألقِ نظرة على الكود وراء خطأ apollo-link-error لبعض الأمثلة!

تضمين التغريدة
ماذا لو كنت أرغب في اكتشاف خطأ في الشبكة؟
دعنا نقول 400 ، طلب سيء.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات