Apollo espone due tipi di errori attraverso la sua API: errori GraphQL , che vengono restituiti come parte della risposta come errors
, insieme data
, ed errori di rete che si verificano quando una richiesta fallisce. Si verificherà un errore di rete quando non è possibile raggiungere un server o se lo stato della risposta è diverso da 200 richiesteerrors
nella risposta possono comunque avere uno stato di 200. Ma una query non valida, ad esempio, comporterà uno stato 400 e un errore di rete in Apollo Client.
Apollo Client offre in realtà quattro modi diversi per gestire gli errori di mutazione:
1.) Chiamare la mutate
funzione restituita dall'hook restituisce una Promessa. Se la richiesta ha esito positivo, Promise si risolverà in un oggetto risposta che include il data
reso dal server. Se la richiesta fallisce, la promessa verrà rifiutata con l'errore. Questo è il motivo per cui viene visualizzato un messaggio "Rifiuto non gestito" nella console: è necessario gestire la promessa rifiutata.
login()
.then(({ data }) => {
// you can do something with the response here
})
.catch(e => {
// you can do something with the error here
})
o con sintassi asincrona / wait:
try {
const { data } = await login()
} catch (e) {
// do something with the error here
}
Per impostazione predefinita, la promessa rifiuterà su entrambi errori GraphQL o errori di rete. Impostando errorPolicy su ignore
o all
, comunque, solo Promessa rifiuta gli errori di rete. In questo caso, gli errori GraphQL saranno comunque accessibili tramite l'oggetto response, ma Promise si risolverà.
2.) L'unica eccezione a quanto sopra si verifica quando si fornisce una onError
funzione. In questo caso, la Promessa si risolverà sempre invece di rifiutare, ma se si verifica un errore, onError
verrà chiamato con l'errore risultante. L' errorPolicy
impostazione impostata si applica anche qui: onError
verrà sempre chiamata per gli errori di rete ma verrà chiamata solo con errori GraphQL quando si utilizza l'impostazione predefinita errorPolicy
di none
. L'uso onError
equivale a catturare la Promessa rifiutata: sposta semplicemente il gestore degli errori dal sito di chiamata della mutate
funzione al sito di chiamata dell'hook.
3.) Oltre alla mutate
funzione, l' useMutation
hook restituisce anche un oggetto risultato. Questo oggetto espone anche eventuali errori riscontrati durante l'esecuzione della mutazione. A differenza delle funzioni del gestore errori che abbiamo scritto sopra, questo error
oggetto rappresenta lo stato dell'applicazione . Sia l' error
e data
oggetti esposti questo esiste modo per comodità. Sono equivalenti a fare questo:
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)
}
}
Avere uno stato di errore come questo può essere utile quando vuoi che la tua UI rifletta il fatto che c'è un errore. Ad esempio, è possibile modificare il colore di un elemento fino a quando la mutazione non viene eseguita senza errori. Invece di dover scrivere tu stesso la suddetta piastra della caldaia, puoi semplicemente usare l'oggetto risultato fornito.
const [mutate, { data, error }] = useMutation(YOUR_MUTATION)
NOTA: sebbene sia possibile utilizzare lo stato di errore esposto per aggiornare l'interfaccia utente, farlo non è un sostituto per la gestione effettiva dell'errore. È necessario fornire una onError
richiamata ocatch
l'errore per evitare avvisi relativi a un rifiuto Promise non gestito.
4.) Infine, puoi anche usare apollo-link-error per aggiungere global gestione errori per le tue richieste. Ciò consente, ad esempio, di visualizzare una finestra di dialogo di errore indipendentemente dal punto in cui l'applicazione ha avuto origine la richiesta.
Quale di questi metodi usi nella tua applicazione dipende fortemente da cosa stai cercando di fare (globale vs locale, stato vs callback, ecc.). La maggior parte delle applicazioni utilizzerà più di un metodo di gestione degli errori.