Nuxt を SPA フロントエンドとして利用し、バックエンドは API サーバーとして分離する構成でローカル環境においてCORSが発生する場合
Nuxt を SPA フロントエンドとして利用し、バックエンド API を別サーバーで起動している場合、ローカル環境では CORS ポリシーでエラー が発生することがある。
必要があれば API 側に CORS を許容する実装を入れるべきだが、本番環境では同じオリジンで運用している場合は、開発環境でのみ有効な設定を入れたい。
この場合、Nuxt 側で Nitro の devProxy を利用し、Nuxt dev server への /api リクエストをバックエンド API サーバーへプロキシすることで回避できる。
https://nitro.build/config#devproxy
例えば、以下のような構成の場合。
- Nuxt dev server:
http://localhost:3000 - Backend API server:
http://localhost:8080
ブラウザから http://localhost:8080 に直接リクエストすると、オリジンが異なるため CORS の対象になる。
この場合、 nuxt.config.ts に Nitro の devProxy を入れることで回避できる。
// nuxt.config.ts
export default defineNuxtConfig({
nitro: {
devProxy: {
"/api": "http://localhost:8080/api",
},
},
});
useFetchで以下のようにAPI呼び出しを実装すると、devProxyで設定したURLにリクエストが転送される。
<script setup>
const { data } = await useFetch("/api/health");
</script>
ただし、あくまでリクエスト自体は Nuxt の dev server に向けて行われるため、ブラウザのデベロッパーツール上は http://localhost:3000/api/health へのリクエストになるため注意が必要。