Apollo eksponuje dwa rodzaje błędów poprzez jego API: GraphQL błędy , które są zwracane jako część odpowiedzi, jak errors
obok data
i błędów w sieci , które występują, gdy wniosek nie powiedzie się. Błąd sieci wystąpi, gdy nie będzie można połączyć się z serwerem lub jeśli stan odpowiedzi jest inny niż 200 - zapytania, które zawierają errors
odpowiedź, mogą nadal mieć status 200. Ale na przykład nieprawidłowe zapytanie spowoduje status 400 i błąd sieci w kliencie Apollo.
Klient Apollo udostępnia cztery różne sposoby obsługi błędów mutacji:
1.) Wywołanie mutate
funkcji zwróconej przez hak zwraca Obietnicę. Jeśli żądanie zakończy się powodzeniem, obietnica zostanie rozstrzygnięta na obiekt odpowiedzi zawierający data
zwrócony przez serwer. Jeśli żądanie nie powiedzie się, obietnica zostanie odrzucona z błędem. Dlatego w konsoli pojawia się komunikat „Nieobsługiwane odrzucenie” - musisz obsłużyć odrzuconą obietnicę.
login()
.then(({ data }) => {
// you can do something with the response here
})
.catch(e => {
// you can do something with the error here
})
lub ze składnią async / await:
try {
const { data } = await login()
} catch (e) {
// do something with the error here
}
Domyślnie Obietnica odrzuci on zarówno błędy GraphQL lub błędy sieciowe. Po ustawieniu parametru errorPolicy na ignore
lub all
, ale, obietnica będzie odrzucana tylko w przypadku błędów sieciowych. W takim przypadku błędy GraphQL będą nadal dostępne za pośrednictwem obiektu odpowiedzi, ale obietnica zostanie rozwiązana.
2.) Jedyny wyjątek od powyższego występuje, gdy udostępniasz onError
funkcję. W takim przypadku obietnica zawsze zostanie rozwiązana zamiast odrzucenia, ale jeśli wystąpi błąd, onError
zostanie wywołana z błędem wynikowym. errorPolicy
Ustawienie dotyczy tutaj też - onError
zawsze będzie wzywał do błędów w sieci, ale zostanie wywołana tylko z błędami GraphQL przy użyciu domyślnego errorPolicy
z none
. Użycie onError
jest równoważne złapaniu odrzuconej obietnicy - po prostu przenosi moduł obsługi błędów z miejsca wywołania mutate
funkcji do miejsca wywołania haka.
3.) Oprócz mutate
funkcji useMutation
hak zwraca również obiekt wynikowy. Ten obiekt ujawnia również wszelkie błędy napotkane podczas uruchamiania mutacji. W przeciwieństwie do funkcji obsługi błędów, które napisaliśmy powyżej, ten error
obiekt reprezentuje stan aplikacji . Zarówno eksponowane w ten sposób, jak error
i data
obiekty istnieją dla wygody. Są odpowiednikiem aby w ten sposób:
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)
}
}
Wystąpienie takiego stanu błędu może być przydatne, gdy chcesz, aby interfejs użytkownika odzwierciedlał błąd. Na przykład możesz zmienić kolor elementu, dopóki mutacja nie uruchomi się bez błędu. Zamiast samodzielnie pisać powyższy szablon, możesz po prostu użyć dostarczonego obiektu wynikowego.
const [mutate, { data, error }] = useMutation(YOUR_MUTATION)
UWAGA: Chociaż do ujawnienia interfejsu użytkownika można użyć stanu ujawnionego błędu, nie zastępuje to faktycznej obsługi błędu. Państwo musi też zapewnić onError
telefonicznego lub catch
błąd w celu uniknięcia ostrzeżenia o nieobsłużonego odrzucenia obietnicy.
4.) Na koniec możesz także użyć apollo-link-error, aby dodać globalną obsługę błędów dla swoich żądań. Pozwala to na przykład wyświetlić okno dialogowe błędu, niezależnie od tego, w której aplikacji pochodzi żądanie.
Która z tych metod, których używasz w swojej aplikacji, zależy w dużej mierze od tego, co próbujesz zrobić (globalny vs lokalny, stan kontra wywołanie zwrotne itp.). Większość aplikacji korzysta z więcej niż jednej metody obsługi błędów.