<p>рдХреЙрд▓рд░ рдХреЛ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐</p>

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЕрдкреНрд░реИрд▓ 2019  ┬╖  17рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: apollographql/apollo-link

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдСрде рдФрд░ рдПрдбрдорд┐рди рдЧреНрд▓реЛрдмрд▓ рдПрд░рд░ рдХреЛ рдореИрдиреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реЗ рд╡рд╛рджреЗ рдореЗрдВ рдореЗрд░реЗ рдкрдХрдбрд╝рдиреЗ рдХреЗ рддрд░реАрдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рд╡реЗ рдХреЙрд▓рд░ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЬрд╛рддреА рд╣реИрдВред

рдХреНрдпрд╛ рдХреЙрд▓рд░ рдХреЛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХреВрдВ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛, рдЕрдЬреАрдм рддрд░рд╣ рдХрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ:

рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ

  updateProfile: function() {
      this.$apollo
        .mutate({
          mutation: UPDATE_PROFILE,
          variables: current_user
        })
        .catch((error) => {
          console.log("this prints just the message", error);
        });
    }

рд▓реЗрдХрд┐рди рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкреВрд░реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ

  updateProfile: function() {
      this.$apollo
        .mutate({
          mutation: UPDATE_PROFILE,
          variables: current_user
        })
        .catch(({ graphQLErrors }) => {
          console.log("this prints the full content of 'errors'", graphQLErrors);
        });
    }

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
@Nosherwan @romucci @Seat @lbrdar

рд╕рднреА 17 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдРрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореИрдВ рддреНрд░реБрдЯрд┐ рд▓рд┐рдВрдХ рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧ рдХрд░ рд╕рдХреВрдВ) рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рдХреЙрд▓рд░ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рдкрд░ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ .

рдореЗрд░рд╛ рдХреЛрдб:

  • рдкреНрд░рджрд╛рддрд╛ рдореЗрдВ:
const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors) {
    graphQLErrors.forEach(({ message, locations, path }) => {
        console.log(`[GraphQL error]: ${message}, Location: ${locations}, Path: ${path}`);
      },
    );
  }
});

const client = new ApolloClient({
  link: authLink.concat(errorLink).concat(httpLink),
  cache: new InMemoryCache(),
});

  • рдШрдЯрдХ рдореЗрдВ:
 loginMutation({ variables: { data } })
    .then(({ data, errors }) => {
      if (errors) {
        // I WANT TO BE ABLE TO READ ERROR MESSAGE HERE SO I CAN DISPLAY IT TO THE USER
      } else if (data) {
        ....
      }
    });

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ forward рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ then рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рди рддреЛ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛ рдФрд░ рди рд╣реА рддреНрд░реБрдЯрд┐ рдФрд░ errors рд╕реЗ null рднреА n рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@lbrdar рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ?

рдирд╣реАрдВ

@lbrdar рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдкрдХрдбрд╝ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИ?

 loginMutation({ variables: { data } })
    .then(({ data, errors }) => {
      if (errors) {
        // I WANT TO BE ABLE TO READ ERROR MESSAGE HERE SO I CAN DISPLAY IT TO THE USER
      } else if (data) {
        ....
      }
    }).catch(errors => {

    });

@lbrdar @romucci рдореИрдВ рдЙрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛?

@Nosherwan рдореИрдВрдиреЗ рдЕрднреА рд╕рдВрд╕реНрдХрд░рдг 1.1.11 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдм рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ... рдЖрдк рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рд╡рд╛рджреЛрдВ рдХреА рднреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд╣реАрдВ рдЖрдк рдЕрдиреНрдп рд╡рд╛рджреЗ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП рд╣реЛрдВ)

@merksam рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореИрдВ рдЖрдкрдХреЗ рдЬреИрд╕рд╛ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╣реА рд╣реИред

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

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдмреНрд▓реЙрдХ рдореЗрдВ, graphQLErrors рдкрдХрдбрд╝реЗ рдЧрдП рд╣реИрдВ рдФрд░ рдСрдирд░рд░ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрд▓рд┐рдВрдЧ рд╡рд╛рджреЗ рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП 'рдлрд┐рд░' рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╣реИред
рдХреИрдЪ рдмреНрд▓реЙрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрд╛рдп рдЦреЛрдЬрд╛ рд╣реИ?

@ рдиреЛрд╢реЗрд░рд╡рд╛рди @ рдкреНрд░реЗрдо-рдкреНрд░рдХрд╛рд╢ рдХреНрдпрд╛ рд╣рдо рдЪреИрдЯ рдореЗрдВ рдХрд╣реАрдВ рд╕рдВрдкрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреЙрд▓ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ? (рдпрджрд┐ рдпрд╣ рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ)

рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛, рдЕрдЬреАрдм рддрд░рд╣ рдХрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ:

рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ

  updateProfile: function() {
      this.$apollo
        .mutate({
          mutation: UPDATE_PROFILE,
          variables: current_user
        })
        .catch((error) => {
          console.log("this prints just the message", error);
        });
    }

рд▓реЗрдХрд┐рди рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкреВрд░реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ

  updateProfile: function() {
      this.$apollo
        .mutate({
          mutation: UPDATE_PROFILE,
          variables: current_user
        })
        .catch(({ graphQLErrors }) => {
          console.log("this prints the full content of 'errors'", graphQLErrors);
        });
    }

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
@Nosherwan @romucci @Seat @lbrdar

рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдВрдХ-рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдПрд░рд░реНрд╕ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрд▓рд░ рдкрд░ рд╡рд╛рдкрд╕ рдХреИрд╕реЗ рднреЗрдЬрдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдПрдХ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдирд┐рдореНрди ApolloQueryResult рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рддреНрд░реБрдЯрд┐ рд╡рд┐рд╡рд░рдг рдСрдирд░рд░ рдореЗрдВ рдХрдВрд╕реЛрд▓ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдХреБрдЫ рдХреЛрд╢рд┐рд╢ рдореЗрдВ ... рдХреЙрд▓ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрдХрдбрд╝ред рд╕рд░реНрд╡рд░ рд╕реЗ graphqlError рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдмрд╕ рдПрдХ "400 рддреНрд░реБрдЯрд┐" ..

const gqlResult: ApolloQueryResult<IGReturnData<
            IAllDataTypes
        >> = await apolloClient.query<IGReturnData<IAllDataTypes>, TVariables>({
            query: queryGql,
            variables: queryVariables,
            errorPolicy: "all",
        });

рд╕рд░реНрд╡рд░ рд╡рд┐рдиреНрдпрд╛рд╕:

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

    if (networkError) console.log(`[Network error]: ${networkError}`);
});

const httplink = new HttpLink({
    uri: "/graphql",
    credentials: "include",
});

const links = [errorLink, httplink];

export const apolloClient = new ApolloClient({
    link: ApolloLink.from(links),
    cache: new InMemoryCache({ addTypename: false, fragmentMatcher }),
});

@ рдкреНрд░реЗрдо-рдкреНрд░рдХрд╛рд╢ рдзрдиреНрдпрд╡рд╛рдж .... рддрд╛рд░рдгрд╣рд╛рд░ ..

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрддреНрдпрдВрдд рд╕реНрдерд╛рдпреА рд╣реИред рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рд╕рд░реНрд╡рд░ рдкрд░ рдореЗрд░рд╛ рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИред рд╕рд░реНрд╡рд░ рд╕рд╣реА рдЖрдХрд╛рд░ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди 400 рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЗ рд╕рд╛рдеред рддреНрд░реБрдЯрд┐-рд▓рд┐рдВрдХ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ graphQLErrors рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдШрдЯрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ, рдЬрдм рдореИрдВ @ рдкреНрд░реЗрдо-рдкреНрд░рдХрд╛рд╢ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП graphQLErrors рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реВрдВ, рддреЛ graphQLErrors рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рд╣реИ . рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджреЗрд╢ "рддреНрд░реБрдЯрд┐: рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдлрд▓ рдирд╣реАрдВ: рдкреНрд░рд╛рдкреНрдд рд╕реНрдерд┐рддрд┐ рдХреЛрдб 400" рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдкреЛрд▓реЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдорд╛рдирд╡-рдкрдардиреАрдп рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ ("рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЧрд▓рдд") рдХреЛ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ 400 рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдЕрдкреЛрд▓реЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг-рд╕реНрдЯреЙрдк рд╣реИред

рдХреНрдпрд╛ рд╡рд╣рд╛рдВ рдХреЛрдИ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде 400 рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рдпреВрдЖрдИ рдХреЛ рдЙрд╕ рдШрдЯрдХ рдкрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдареАрдХ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдиреБрдЪрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:

рдореИрдВ рдХреИрд╢ рдореЗрдВ рдПрдХ рдмреВрд▓рд┐рдпрди hasGraphError рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рдХреИрд╢рд┐рдВрдЧ рднреА рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors) {
    graphQLErrors.forEach(error => {
      // log gql error(s)
      console.log("[GraphQL error]: ", error);
      // cache error
      client.writeData({
        data: {
          hasGraphError: true,
          currentGraphError: error.message
        }
      });
    });
  }
  if (networkError) {
    // log network errors
    console.log("[Network error]: ", networkError);
  }
});

рдлрд┐рд░ рдПрдХ MutationError рдШрдЯрдХ рдореЗрдВ, рдореИрдВ рддреНрд░реБрдЯрд┐ рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рддрд╛ рд╣реВрдВ, рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ gql рддреНрд░реБрдЯрд┐ рдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ:

const HAS_ERROR = gql`
  query IsGraphErrorPresent {
    hasGraphError <strong i="11">@client</strong>
    currentGraphError <strong i="12">@client</strong>
  }
`;
export default function MutationError({ error }) {
  const { data } = useQuery(HAS_ERROR);
  const defaultErrorMessage =
    "We're having trouble connecting. Please check your internet connection and try again.";

  // real network error
  if (error && error.message.includes("Failed to fetch")) {
    return <Error>{defaultErrorMessage}</Error>;
  }

  // graph error
  if (error && data && data.hasGraphError) {
    return <Error>{data.currentGraphError}</Error>;
  }

  // probably a real server/network error
  if (error) {
    return <Error>{defaultErrorMessage}</Error>;
  }

  return null;
}

рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рднреА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рд╕рд░реНрд╡рд░ _always_ 400 рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ 200 + рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдирдордХреАрди рд╣реВрдВ) ...

рддреЛ рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдкрд░, рдореИрдВ рдПрдХ рдЦрд╛рд▓реА рдСрдирд░ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдкреЛрд▓реЛ рд╕реЗ рдПрдХ рдЕрдирдЪрд╛рд╣реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдлрд▓рддрд╛ рдкрд░ рдореБрдЭреЗ рдХреИрд╢ рдореЗрдВ рд╣реИрдЧреНрд░рд╛рдл рдПрд░рд░ рдмреВрд▓рд┐рдпрди рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

  const [someMutation, { loading, error, client }] = useMutation(SOME_MUTATION, {
    onError() {
      // this callback prevents apollo from throwing
      // ...unhandled exception on 400 status code
    },
    onCompleted({ someMutation }) {
      client.writeData({
        data: {
          hasGraphError: false
        }
      });
    }
  });

рдлрд┐рд░ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рддреНрд░реБрдЯрд┐ рдШрдЯрдХ useMutation рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рд╣рд╛рд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ (рдЬреЛ рджреЛрдиреЛрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЧрд▓рдд рдШрдЯрдХ рдкрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдХреИрд╢реНрдб gql рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ):

  {loading && <Spinner />}
  {error && <MutationError error={error} />}

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЕрдиреБрдЪрд┐рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:

  1. рдЖрдо рддреМрд░ рдкрд░ рдпреВрдЖрдИ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рднрд▓реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЧреИрд░ -200 рд╕реНрдерд┐рддрд┐ рдХреЛрдб рд╣реЛ
  2. рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ UI рдореЗрдВ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рддреНрд░реБрдЯрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдШрдЯрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ

рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ: рдпрд╣ рд╕рд░рдгреА рдореЗрдВ рдХреИрд╢ рдореЗрдВ рдЕрдВрддрд┐рдо GQL рддреНрд░реБрдЯрд┐ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ GQL рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдХрд░, рдФрд░ рдЗрд╕реЗ рдХреИрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╕реНрдХреАрдорд╛/рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ JSON.stringify рдЗрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╢ рдХрд░реЗрдВред рдмреВрд▓рд┐рдпрди рдХреЛ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рд╕рдлрд▓рддрд╛ рдкрд░ рдХреИрд╢ рдореЗрдВ currentGraphError рдХреЛ рднреА рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ!

рд╕рд╛рде рд╣реА, рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдиреАрддрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдХ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ, рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдкреАрдЖрд░ рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: https://github.com/apollographql/apollo-client/pull/5863 , рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдордп рд░рд┐рд▓реАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИред

рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Morantron picture Morantron  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Kisepro picture Kisepro  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

techyrajeev picture techyrajeev  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ignivalancy picture ignivalancy  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vjpr picture vjpr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ