Closed12
環境で結果が変わるVercelエラーたち
ピン留めされたアイテム

ここで紹介するエラー:
- VERCEL_URLがプロダクションビルドだとビルドのものになっていた?ため、別オリジンへのリクエストが飛びCORSポリシー違反でエラー
- プレビュー環境だと認証処理が入るためAPIのレスポンスがHTMLになり、JSONでパースできないためエラー

解決策は現在自分が取っている方法を書いているものの、ろくなものではないです
情報提供できるよ、という方がいたらぜひお願いします

その1
VERCEL_URLがプロダクションビルドだとビルドのものになっていた?ため、別オリジンへのリクエストが飛びCORSポリシー違反でエラー
- 本番環境のURLでのみ発生
- 以下の環境では発生しない
- プレビュー環境
- プロダクションビルドが適用されている
https://プロジェクト名-ハッシュ-nanasi1s-project.vercel.app
形式のURL(未検証)

何がしたかったか
- APIとフロントエンドをNext.jsで開発している
- APIのエンドポイントを環境変数で定義したかった <= 変更容易性的な(意味ない?
- 環境変数
API_ENDPOINT
は自身のドメイン +/api
だが、これをVercelでやるのは難しかったためnext.config.ts
で定義していた- ローカル:開発サーバーのURL(
http://localhost:3000
) - Vercel:
VERCEL_URL
の値を使用
- ローカル:開発サーバーのURL(

何が起こったか
ローカル環境でもプレビュー環境でも問題なく動いていた。
プレビューで動くなら本番でも大丈夫だと思い、PRをマージしてプロダクションビルドした。
すると、
-
VERCEL_URL
はhttps://プロジェクト名-ハッシュ-nanasi1s-project.vercel.app
となる -
API_ENDPOINT
はビルド時にVERCEL_URL
の値が埋め込まれる - APIへのHTTPリクエストは
API_ENDPOINT
がベースになっている -
https://プロジェクト名.vercel.app
からアクセスした結果、-
https://プロジェクト名-ハッシュ-nanasi1s-project.vercel.app
とはドメインが違う - CORSポリシーに違反するためエラー
-
Vercelのシステム環境変数:

普通に考えてもうちょっといいVERCEL_URL
の取り回しがありそうなものだが、どうしてこうなった?
本番でのビルド=それ以外のURLのビルドなので、デフォルトの?ハッシュがあるURLが埋め込まれてしまった、ということなんだろうか
それとも、
- CI/CDが悪い => VercelとGitHubを連携した時のデフォルトだし平気?
-
next.config.ts
が悪い => なくはないか...?

解決策
next.config.ts
では環境変数を動的に設定できるので、VERCEL_ENV
を使ってプロダクションビルドとプレビュービルドを条件分岐しよう
-
VERCEL_ENV === 'production'
:VERCEL_PROJECT_PRODUCTION_URL
-
VERCEL_ENV === 'preview'
:VERCEL_URL

その2
プレビュー環境だと認証処理が入るためAPIのレスポンスがHTMLになり、JSONでパースできないためエラー
- プレビュー環境のみ発生
- 本番環境では発生しない(未検証)

何がしたかったか
- APIとフロントエンドをNext.jsで開発している
-
/api/posts
にある投稿一覧にアクセスし、それを画面に表示したい- これを行うコンポーネントはサーバーコンポーネント
- => データフェッチはサーバーで行う
- レスポンスは
Response
のjson
メソッドでパースしていた

何が起こったか
- Vercelのプレビュー環境では、デフォルトだと認証処理が入る
- ログインしているVercelアカウントにアクセス権があるか確認してるっぽい
- ページにアクセスし、
/api/posts
にリクエストが送られた- ローカル環境では正常に動いていた
- レスポンスは
Auth...
という感じのHTMLだった - ↑はJSON形式ではないため、パースしようとしてエラーが発生
- ↑はサーバーエラーのため、ステータスコード
500
が返される

解決策
Vercelの設定からプレビュー環境の認証を解除すれば動く。
プレビューが見られたらまずいプロジェクトでもない限り、OFFでもいいかもしれない。
もしくはそういうのに対策できる何かがある?(調べてない)

(認証というか認可な気がするけど気にしない)
このスクラップは2025/01/11にクローズされました