Nuxt.jsでaxiosから$fetchやuseFetchに変えたときにcatchの中に入ってくれない【備忘録】
Nuxt2からNuxt3へバージョンアップを行った際に、今までaxiosを使って行っていたAPIの処理を$fetchやuseFetchを使って行うようにしました。
すると下記のようにtry catchでくくったのに、エラーが起きたときにcatchの中に入ってくれないという事象が起きました。
1 2 3 4 5 6 |
try { // 処理 const { data, error } = await $api.post() } catch (e) { // エラーが起きたときの処理 } |
今回はその原因はなんなのかについてご紹介していきます。
検索にも引っかからず、ややまとまりがないため個人の備忘録に近いです。
Nuxt.jsのバージョンは3.11.2となります。
Nuxt.jsでaxiosから$fetchやuseFetchに変えたときにcatchの中に入ってくれない【備忘録】
結論を言うと、例えばAPIを叩いて401エラーが発生している際に、$fetchやuseFetchがエラーをH3Errorオブジェクトで返すのではなく、結果のerrorプロパティに含めて返すため、catchの中に入りません。
そのため、try-catchではなく、useFetchのエラーハンドリング方法に変更する必要があります。
1 2 3 4 5 6 7 8 9 |
try { const { data, error } = await $api.post() // エラーが発生している場合に明示的に例外を投げる if (error.value) { throw error.value } } catch (e) { // エラーが起きたときの処理 } |
あるいは、
import { H3Error } from 'h3'
でH3Errorをインポートして、onRequestなどのときに
1 2 3 |
const h3Error = new H3Error(message || 'An error occurred') h3Error.statusCode = code || 500 throw h3Error |
などで明示的にh3Errorをスローすると良いでしょう。
終わりに
Nuxt2からNuxt3へバージョンアップを行った際に、今までaxiosを使って行っていたAPIの処理を$fetchやuseFetchを使って行うようにした際に、エラーが起きたときにcatchの中に入ってくれないという事象が起きたときの原因と対処法についてご紹介いたしました。
ディスカッション
コメント一覧
まだ、コメントがありません