web-dev-qa-db-fra.com

Puis-je envoyer une erreur dans le message axios en fonction du statut de la réponse

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é.

12
jenny

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);
11
Ilario Engler

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)
    });
5
jenny