Est-il possible de lancer une erreur exprès à l'intérieur du bloc .then () dans axios? Par exemple, si l'api répond avec le code d'état 204, puis-je envoyer une erreur et exécuter le bloc catch?
Par exemple:
axios.post('link-to-my-post-service', {
json-input
}).then(response => {
if (response.status === 200) {
//proceed...
}
else {
// throw error and go to catch block
}
}).catch(error => {
//run this code always when status!==200
});
MODIFIER
J'ai essayé, mais cela n'a pas fonctionné:
var instance = axios.create({
validateStatus: function (status)
{
return status == 200;
}
});
axios.post('link-to-my-post-service', {input: myInput}, instance)
.then(response => {
dispatch({
type: "FETCH_SUCCESS",
payload: response.data
});
}).catch(error => {
dispatch({
type: "FETCH_FAILED",
payload: error
});
});
Lorsque j'obtiens un code d'état 204, le bloc exécuté est toujours le bloc () au lieu du bloc catch.
MODIFIER 2
La bonne réponse en utilisant la suggestion d'Ilario est la suivante:
var instance = axios.create({
validateStatus: function (status)
{
return status == 200;
}
});
instance.post('link-to-my-post-service', {input: myInput})
.then(response => {
dispatch({
type: "FETCH_SUCCESS",
payload: response.data
});
}).catch(error => {
dispatch({
type: "FETCH_FAILED",
payload: error
});
});
Maintenant, lorsque le code d'état n'est pas égal à 200, le code de bloc de capture est exécuté.
Si vous jetez un œil au GitHub Page du projet , vous remarquerez la description de l'option suivante.
/* `validateStatus` defines whether to resolve or reject the promise for a given
* HTTP response status code. If `validateStatus` returns `true` (or is set to `null`
* or `undefined`), the promise will be resolved; otherwise, the promise will be
*/ rejected.
validateStatus: function (status) {
return status >= 200 && status < 300; // default
},
Vous pouvez donc créer une instance avec votre propre configuration.
var instance = axios.create({
validateStatus: function (status) {
return status == 200;
},
});
Vous pouvez également définir des valeurs par défaut. Celles-ci seront appliquées à chaque demande.
axios.defaults.validateStatus = () => {
return status == 200;
};
MISE À JOUR 1
Pour définir la configuration uniquement sur une opération spécifique, vous pouvez remplacer "config" par vos valeurs ou méthodes souhaitées.
axios.post(url[, data[, config]])
MISE À JOUR 2
J'ai essayé ça, mais ça n'a pas marché.
Vous ne pouvez pas passer l'instance à axios.post (). Vous devez appeler post sur la nouvelle instance.
var instance = axios.create({
validateStatus: function (status) {
return status == 200;
}
});
instance.post('url', data, config);
Merci beaucoup pour vos suggestions. La réponse a été plus simple que ce à quoi je m'attendais.
Je ne voulais pas définir d'options par défaut pour changer le comportement des axios, alors j'ai juste essayé quelque chose comme le code ci-dessous, et cela a fonctionné. Chaque fois que le code throw new Error("Error");
est exécuté, le code de bloc catch est exécuté après cela.
axios.post('link-to-my-post-service', {
json-input
}).then(response => {
if (response.status === 200) {
//proceed...
}
else {
// throw error and go to catch block
throw new Error("Error");
}
}).catch(error => {
//when throw "Error" is executed it runs the catch block code
console.log(error)
});