Распространить ошибку ApolloError на клиента

#javascript #graphql #apollo-client #apollo-server #graphql-js

#javascript #graphql #apollo-клиент #apollo-сервер #graphql-js

Вопрос:

Мне очень трудно получить пользовательскую ошибку Apollo на стороне клиента.

Вот код сервера:

 ...
const schema = makeExecutableSchema({
  typeDefs: [constraintDirectiveTypeDefs, ...typeDefs],
  resolvers,
  schemaTransforms: [constraintDirective()],
});


const server = new ApolloServer({
  schema,
  dataSources,
  context({ req }) {
    const token = req.headers.authorization;

    const user = token ? getUserFromToken(token) : '';

    return { user };
  },

  debug: false,
  formatError: (err) => { 
    // ToDo: Generate unique token and log error
    if (err!.extensions!.code == 'INTERNAL_SERVER_ERROR') {
      return new ApolloError('We are having some trouble', 'ERROR', {
        token: 'uniquetoken',
      });
    }
    return err;
  },
  uploads: false,
});
...
 

Клиентский код:

  ...
const ADD_CLAIM = gql`
  mutation addClaim($claim: ClaimInput!) {
    addClaim(claim: $claim) {
      id
    }
  }
`;
...

 const [addClaim, { data, error }] = useMutation(ADD_CLAIM);

 ...

 const onSubmit = async () => {
   try {
    debugger;
    const r = await addClaim({
      variables: {
        input: {
          id: insured.insured,
          date: '20/12/2020',
      ...
          therapy: treatment.treatments.map(treat => ({
            id: treat.treatId,
        ...
          })),
        },
      },
    });

    debugger;

    console.log('r', r);

    } catch (err) {
      debugger;
      setFormError(error ? error.message : err.message);
      console.log('Error:', err);
    }
  };

...


  if (error) {
    debugger;
    return <div>error</div>;
  }
 

Я ожидаю получить пользовательскую ошибку: «У нас возникли некоторые проблемы».
Однако, независимо от того, что я делаю, я получаю: «Ответ не прошел успешно: получен код состояния 400».

Я на 100% выдаю пользовательскую ошибку с сервера: введите описание изображения здесь

Но я получаю на стороне клиента: введите описание изображения здесь

Более того, когда я проверяю вкладку network в инструментах разработчика, в ответ у меня появляется моя ошибка: введите описание изображения здесь

Но я не могу получить к нему доступ из кода. Кстати, на игровой площадке я вижу свою ошибку: введите описание изображения здесь

Комментарии:

1. обычная ошибка gql равна 200 … у крючка может быть onError обработчик, крючок возвращает error реквизит (использовать напрямую / в действии)… вам не нужно await/try/catch … размещать debugger в «основном компоненте body / flow» или в onError обработчике … или используйте ссылку apollographql.com/docs/react/data/error-handling

2. Я сделал это. Это не помогает.

Ответ №1:

Здесь, где мои ошибки :

 error.networkError.result.errors
 

Чего никто не знает?

Или

 const errorLink = onError(({ graphQLErrors, networkError }) => {
  debugger;
  console.log(graphQLErrors);
  console.log(networkError);
});

const client = new ApolloClient({
  ...
  link: ApolloLink.from( [errorLink, ...]),    
});
 

Это тоже работает.

Да, иногда GraphQL — неприятный зверь