Apollo викриває два типи помилок через API: помилки GraphQL , які повертаються як частина відповіді errors
, поряд із помилками мережіdata
та помилками, що виникають при відмові запиту. Мережна помилка буде виникати, коли сервер не вдасться отримати або якщо відповідь не відрізняється від 200 - запити, які мають errors
відповідь, все ще можуть мати статус 200. Але недійсний запит, наприклад, призведе до стан 400 і мережева помилка в Apollo Client.
Клієнт Apollo насправді пропонує чотири різні способи вирішення помилок мутації:
1.) Виклик mutate
функції, повернутої гаком, повертає Обіцянку. Якщо запит буде успішним, Обіцяння вирішиться на об’єкт відповіді, що включає data
повернений сервер. Якщо запит не вдасться, Обіцянка відхилить помилку. Ось чому ви бачите на консолі повідомлення "Непридатне відхилення" - вам потрібно обробити відхилену Обіцянку.
login()
.then(({ data }) => {
// you can do something with the response here
})
.catch(e => {
// you can do something with the error here
})
або з синтаксисом async / wait:
try {
const { data } = await login()
} catch (e) {
// do something with the error here
}
За замовчуванням Обіцянка буде відхиляти або помилки GraphQL, або мережеві помилки. Встановивши errorPolicy на ignore
або all
, хоча, Обіцяння буде відхиляти лише мережеві помилки. У цьому випадку помилки GraphQL все ще будуть доступні через об’єкт відповіді, але Обіцяння вирішиться.
2.) Єдиний виняток із вищезазначеного відбувається, коли ви надаєте onError
функцію. У цьому випадку Обіцянка завжди вирішиться замість відхилення, але якщо виникла помилка, onError
буде викликана помилка, що виникає. Налаштування, які errorPolicy
ви встановили, застосовуються і тут - onError
завжди будуть викликатися помилками в мережі, але викликатимуться лише помилками GraphQL при використанні стандартних errorPolicy
параметрів none
. Використання onError
еквівалентно лову відхиленої Обіцянки - вона просто переміщує обробник помилок з сайту викликуmutate
функції на сайт виклику гака.
3.) Окрім mutate
функції, useMutation
гачок також повертає об'єкт результату. Цей об’єкт також виявляє будь-які помилки, що виникають під час запуску мутації. На відміну від функцій обробника помилок, про які ми писали вище, цей error
об'єкт представляє стан програми . І об'єкти, error
і data
об'єкти, відкриті таким чином, існують як зручність. Вони рівноцінні цьому:
const [mutate] = useMutation(YOUR_MUTATION)
const [data, setData] = useState()
const [error, setError] = useState()
const handleClick = async () => {
try {
const { data } = await mutate()
setData(data)
catch (e) {
setError(e)
}
}
Такий стан помилок може бути корисним, коли ви бажаєте, щоб інтерфейс користувача відображав факт помилки. Наприклад, ви можете змінити колір елемента, поки мутація не запуститься без помилки. Замість того, щоб писати вищевказану котельну табличку самостійно, ви можете просто використовувати наданий об'єкт результату.
const [mutate, { data, error }] = useMutation(YOUR_MUTATION)
ПРИМІТКА. Хоча ви можете використовувати відкритий стан помилок для оновлення інтерфейсу користувача, це не є фактично заміною обробки помилки. Ви повинні або надати onError
зворотний дзвінок, або catch
помилку, щоб уникнути попереджень про необроблене відхилення обіцянки.
4.) Нарешті, ви також можете використовувати apollo-link-error, щоб додати глобальну обробку помилок для своїх запитів. Це дозволяє, наприклад, відображати діалогове вікно про помилку незалежно від того, де у вашій програмі виник запит.
Який із цих методів ви використовуєте у своїй програмі, в значній мірі залежить від того, що ви намагаєтеся зробити (глобальний проти локального, стан проти зворотного виклику тощо). Більшість додатків використовуватиме більш ніж один метод обробки помилок.