J'ai un peu de mal à mettre en place la gestion des erreurs avec vuex. Il semble y avoir plusieurs façons de le faire et peu de documentation sur la bonne gestion des erreurs. J'ai expérimenté quatre alternatives, mais je n'ai pas encore trouvé de solution satisfaisante.
Alternative 1 - Capture et traitement des erreurs sur le composant
sur pages/login.vue :
export default {
methods: {
onLogin() {
this.$store.dispatch('auth/login', {
email: this.email,
password: this.password,
}).then(() => {
this.$router.push('/home');
}).catch((error) {
// handle error in component
});
},
},
}
sur store/auth.js :
export const actions = {
login({ commit }, { email, password }) {
return this.$axios.post('/api/login', {
email,
password,
}).then((res) => {
doSomething(res);
});
},
}
PROS
- Hmm.
CONS
- Les erreurs ne sont pas traitées et stockées dans Vuex.
- Introduit beaucoup de code passe-partout dans les méthodes des composants.
Alternative 2 - Capture et traitement des erreurs en vuex
sur pages/login.vue :
export default {
methods: {
onLogin() {
this.$store.dispatch('auth/login', {
email: this.email,
password: this.password,
}).then(() => {
this.$router.push('/home');
});
},
},
}
sur store/auth.js :
export const actions = {
login({ commit }, { email, password }) {
return this.$axios.post('/api/login', {
email,
password,
}).then((res) => {
doSomething(res);
}).catch((error) => {
// store error in application state
commit('SET_ERROR', error);
});
},
}
PROS
- L'objet d'erreur est accessible avec vuex depuis n'importe quel composant
- On pourrait utiliser un composant d'erreur réactif dans la mise en page, qui est révélé lorsque l'état d'erreur change.
CONS
- Je ne suis pas sûr qu'il y ait un moyen de suivre la source de l'erreur, à partir de quel composant elle a été lancée.
Alternative 3 - Capture des erreurs à l'aide des intercepteurs axios
sur plugins/axios.js :
export default function({ $axios, store }) {
$axios.onError(error => {
store.dispatch('setError', error);
});
}
sur pages/login.vue :
export default {
methods: {
onLogin() {
this.$store.dispatch('auth/login', {
email: this.email,
password: this.password,
}).then(() => {
this.$router.push('/home');
});
},
},
}
sur store/auth.js :
export const actions = {
login({ commit }, { email, password }) {
return this.$axios.post('/api/login', {
email,
password,
}).then((res) => {
doSomething(res);
});
},
}
PROS
- Gestion globale des erreurs
- Il n'est pas nécessaire d'attraper les erreurs dans Vuex ou dans le composant.
- Pas de code passe-partout
CONS
- Toutes les exceptions ne sont pas gérées, ce qui signifie que les erreurs non-axios ne sont pas attrapées.
Alternative 4 - Plugin d'erreur personnalisé
J'ai essayé d'implémenter un plugin personnalisé qui récupère toutes les exceptions, mais je ne parviens pas à le faire fonctionner.
sur plugins/catch.js :
export default (ctx, inject) => {
const catchPlugin = function (func) {
return async function (args) {
try {
await func(args)
} catch (e) {
return console.error(e)
}
}
};
ctx.$catch = catchPlugin;
inject('catch', catchPlugin);
}
sur pages/login.vue :
export default {
methods: {
onLogin: this.$catch(async function () {
await this.$store.dispatch('auth/login', { email: this.email, password: this.password });
this.$router.push('/home');
}),
},
}
PROS
- Pas de passe-partout.
- Toutes les erreurs sont prises en compte dans le plugin.
CONS
- Je n'arrive pas à le faire fonctionner. :(
Mon impression est qu'il y a un manque de documentation sur la gestion des erreurs dans vue/nuxt. Quelqu'un a-t-il réussi à faire fonctionner la quatrième solution ? Serait-ce l'idéal ? D'autres alternatives ? Qu'est-ce qui est conventionnel ?
Merci pour votre temps !
0 votes
Je pense que la méthode 3 concernant les intercepteurs axios est bonne pour gérer les erreurs de manière globale. stackoverflow.com/questions/35900230/
0 votes
Le meilleur moyen est d'utiliser
middleware
Document API