Next.jsでのCORSエラー解決(Next.js + Golang)
React + GoでSPAを作りたく、ReactフレームワークのNext.jsを使ってみた。
SPAの最初で躓きがちなCORSエラーについて、案の定ハマったのでメモ。(Angularでの開発の際もだいぶハマった思い出)
CORSエラーが出る
今回のようにフロントエンド、バックエンドでサーバを分けて開発する際に、そのままだとCORS(Cross-Origin Resource Sharing)についてのエラーが発生する。
これはブラウザの機能として、クロスドメイン(ドメインの違うサーバへの)アクセスが制限されているため起きます。
例えば、フロント http://localhost:3000 , バック http://localhost:5000 とした時、フロントからバックのapiを叩こうとするとcorsエラーとなります。(ドメイン違うので)
正常にapi叩くにはこれを解決する必要があります。
Next.jsではカスタムサーバを利用し、プロキシする
Next.jsでカスタムサーバを使用するため、 プロジェクトルートにserver.js を作成します。
また、 http-proxy-middleware というパッケージを使い、任意のリクエストをプロキシします。
const express = require('express');
const next = require('next');
const { createProxyMiddleware } = require('http-proxy-middleware');
const port = parseInt(process.env.PORT, 10) || 3000
const dev = process.env.NODE_ENV !== 'production'
const API_URL = process.env.API_URL || 'http://localhost:5010'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare().then(() => {
const server = express();
server.use(
'/api',
createProxyMiddleware({
target: API_URL,
pathRewrite: {
"^/api": ""
},
changeOrigin: true
})
);
server.all('*', (req, res) => {
return handle(req, res)
});
server.listen(port, err => {
if (err) throw err
console.log(`> Ready on http://localhost:${port}`)
});
});
カスタムサーバを利用してサーバ起動するので package.json を修正します。
...
"scripts": {
"dev": "node server.js",
"build": "next build",
"start": "NODE_ENV=production node server.js"
},
...
これで yarn dev でカスタムサーバで立ち上がります。
リクエストがプロキシされる
上記により、 /api へのリクエストは http://localhsot:5010 にプロキシされます。
例えば /api/auth へリクエストした場合、 http://localhost:5010/auth にプロキシされます。
pathRewrite の記述を消せば http://localhost:5010/api/auth にアクセスします。
まとめ
Next.jsのcorsエラーの解決は、カスタムサーバと http-proxy-middleware パッケージの利用で解決できます。
また忘れてハマりそうなのでメモしておいた。
参考