рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдСрде рдФрд░ рдПрдбрдорд┐рди рдЧреНрд▓реЛрдмрд▓ рдПрд░рд░ рдХреЛ рдореИрдиреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реЗ рд╡рд╛рджреЗ рдореЗрдВ рдореЗрд░реЗ рдкрдХрдбрд╝рдиреЗ рдХреЗ рддрд░реАрдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рд╡реЗ рдХреЙрд▓рд░ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЬрд╛рддреА рд╣реИрдВред
рдХреНрдпрд╛ рдХреЙрд▓рд░ рдХреЛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХреВрдВ?
рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдРрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореИрдВ рддреНрд░реБрдЯрд┐ рд▓рд┐рдВрдХ рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧ рдХрд░ рд╕рдХреВрдВ) рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рдХреЙрд▓рд░ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рдкрд░ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ .
рдореЗрд░рд╛ рдХреЛрдб:
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} />}
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЕрдиреБрдЪрд┐рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:
рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ: рдпрд╣ рд╕рд░рдгреА рдореЗрдВ рдХреИрд╢ рдореЗрдВ рдЕрдВрддрд┐рдо GQL рддреНрд░реБрдЯрд┐ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ GQL рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдХрд░, рдФрд░ рдЗрд╕реЗ рдХреИрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╕реНрдХреАрдорд╛/рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ JSON.stringify рдЗрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╢ рдХрд░реЗрдВред рдмреВрд▓рд┐рдпрди рдХреЛ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рд╕рдлрд▓рддрд╛ рдкрд░ рдХреИрд╢ рдореЗрдВ currentGraphError рдХреЛ рднреА рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ!
рд╕рд╛рде рд╣реА, рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдиреАрддрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдХ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ, рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдкреАрдЖрд░ рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: https://github.com/apollographql/apollo-client/pull/5863 , рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдордп рд░рд┐рд▓реАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИред
рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐?
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛, рдЕрдЬреАрдм рддрд░рд╣ рдХрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ:
рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ
рд▓реЗрдХрд┐рди рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкреВрд░реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
@Nosherwan @romucci @Seat @lbrdar