@apollo/client useLazyQuery .then() срабатывает даже при наличии ошибки (React/graphene-django)
У меня есть бэкенд на graphene-django с запросом me
, который возвращает исключение: You do not have permission to perform this action
если пользователь не вошел в систему.
Из React я вызываю запрос следующим образом:
const [getMe] = useLazyQuery(ME_QUERY); // query not important
React.useEffect(() => {
getMe()
.then((meRes) => {
console.log('Hit the .then()');
if (meRes.data && meRes.data.me) {
setUser(meRes.data.me);
}
})
.catch(() => {
console.log('Hit the .catch()');
});
}, [])
Ответ, который я получаю от бэкенда:
{"errors":[{"message":"You do not have permission to perform this action","locations":[{"line":2,"column":3}],"path":["me"]}],"data":{"me":null}}
Я ожидал, что @apollo/client распознает это как ошибку и моя консоль выведет Hit the .catch()
, но по какой-то причине он вообще не попадает в catch и выводит только Hit the .then()
.
Почему в @apollo/client этот ответ разрешается, а не отклоняется? У меня такая проблема только с запросами, а не с мутациями, которые работают как ожидалось. Например, если я вызову эту мутацию:
const [createUser, { data, loading, error }] = useMutation(CREATE_USER_MUTATION);
createUser({
variables: {
email,
password1,
password2,
},
}).then(() => {
console.log('this should not be hit');
});
И я получаю такой ответ:
{"errors":[{"message":"['This password is too short. It must contain at least 8 characters.', 'This password is too common.']","locations":[{"line":2,"column":3}],"path":["createUser"]}],"data":{"createUser":null}}
@apollo/client правильно распознает это как ошибку, и this should not be hit
не отобразится в консоли, хотя и запрос, и мутация возвращают код состояния 200.
Любая помощь в понимании того, почему useLazyQuery неправильно выполняет .then(), а useMutation правильно выполняет .catch(), была бы очень признательна. При необходимости я могу предоставить больше объяснений со стороны Django или React.