意図的にaxiosの.then()ブロック内でエラーをスローすることは可能ですか?たとえば、APIが204ステータスコードで応答した場合、エラーをスローしてキャッチブロックを実行できますか?
例えば:
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
});
[〜#〜]編集[〜#〜]
私はこれを試しましたが、うまくいきませんでした:
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
});
});
ステータスコード204を取得しても、実行されたブロックはcatchブロックではなくthen()ブロックです。
編集2
Ilarioの提案を使用した正解は次のとおりです。
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
});
});
ステータスコードが200でない場合は、catchブロックコードが実行されます。
GitHub Project Page を見ると、次のオプションの説明に気付くでしょう。
/* `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
},
したがって、独自の構成でインスタンスを作成できます。
var instance = axios.create({
validateStatus: function (status) {
return status == 200;
},
});
デフォルトを設定することもできます。これらはすべてのリクエストに適用されます。
axios.defaults.validateStatus = () => {
return status == 200;
};
更新1
特定の操作でのみ構成を設定するには、「config」を目的の値またはメソッドに置き換えることができます。
axios.post(url[, data[, config]])
更新2
私はこれを試しましたが、うまくいきませんでした。
インスタンスをaxios.post()に渡すことはできません。新しいインスタンスでpostを呼び出す必要があります。
var instance = axios.create({
validateStatus: function (status) {
return status == 200;
}
});
instance.post('url', data, config);
ご提案ありがとうございます。答えは予想よりも簡単でした。
デフォルトのオプションを設定してaxiosの動作を変更したくなかったので、以下のコードのようなものを試したところ、うまくいきました。コードthrow new Error("Error");
が実行されるたびに、その後、catchブロックコードが実行されます。
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)
});