Обработка ошибок Apollo - зачем реагировать на сбои приложения? - PullRequest
0 голосов
/ 22 января 2020

кто-нибудь может объяснить, почему мое приложение реагирует + apollo ведет себя так, когда я пытаюсь использовать мутацию, которая возвращает ошибку?

enter image description here

GraphQL мутация возвращает это (код ответа 200): {"errors":[{"error":{"result":"identity.not-found","error":"authentication-failed","statusCode":401}}],"data":{"login":null}}

Моя мутация выглядит так:

export const LOGIN_MUTATION = gql`
    mutation($input: LoginInput!) {
        login(input: $input) {
            token
        }
    }
`;

с именем:

const handleSignIn = () => {
        loginMutation({
            variables: {
                input: {
                    clientId: config.clientId,
                    username: userName,
                    password: password,
                    clientSecret: config.clientSecret
                }
            }
        });
    };

Она ведет себя некоторое время как ожидается (мой собственный настраиваемый компонент ошибок отображается - {error && <div>error</div>}), но затем он выбрасывает это необработанное отклонение.

Если я добавлю функцию обратного вызова catch в вызов мутации, он будет работать, как и ожидалось.

Однако я нигде не нашел в apollo docs упоминаний о необходимости всегда отлавливать ошибки GraphQL таким образом. Этого должно быть достаточно, если я правильно понимаю: const [loginMutation, {data, loading, error}] = useMutation(LOGIN_MUTATION);

Правильно ли это поведение или я что-то пропускаю?

Версии:

"@apollo/react-hooks": "^3.1.3"
"apollo-boost": "^0.4.7"
"graphql": "^14.5.8"

1 Ответ

0 голосов
/ 22 января 2020

Функция mutate возвращает Обещание, которое по умолчанию будет отклонено, если ваш ответ содержит объект errors или если произошла сетевая ошибка. Если вы измените значение errorPolicy на ignore или all, присутствие errors в вашем ответе не приведет к отклонению обещания, но сетевая ошибка все равно будет.

Единственный способ чтобы избежать такого поведения, нужно предоставить обработчик ошибок через параметр onError. Если указано onError, то Обещание, возвращаемое mutate, будет всегда разрешаться, а любые соответствующие ошибки (в зависимости от вашего errorPolicy) будут вместо этого передаваться onError.

Дополнительные сведения об обработке ошибок в Аполлона можно найти здесь . Дополнительные сведения о необработанных отклонениях Promise можно найти здесь .

...