NowにNuxtでデプロイして502エラーになった話
元々 Vercel にデプロイしていた Nuxt アプリを更新しようとしたら,ビルドは成功するものの Web ページが表示できない状態になりました.
エラーの詳細
An error occurred with this application.
This is an error with the application itself, not the platform.
502: BAD_GATEWAY
Code: `NO_STATUS_CODE_FROM_FUNCTION`
ビルド時のログはプロジェクトの [Overview] タブ > [View Logs] で確認できます.ビルドに失敗した場合はエラーが出ているはずですが,確認したところ WARN は出ているもののビルドは完了していました.
環境
- MacBook Air (13-inch, 2017)
- macOS High Sierra
- Node.js 13.7.0
- npm 6.13.7
設定
now の設定に関係ありそうなところだけ抜き出しています.
package.json
package.json
"engines": {
"node": "12.16"
},
"scripts": {
"build": "nuxt build",
"start": "nuxt start",
"now-build": "nuxt build"
}
now 上の Node.js のバージョンは engines
で指定するようです.開発 PC 上では 13.7.0 で動かしていましたが,now は対応していませんでした.対応していないバージョンを指定するとエラー文が表示されるので,それに従えばいいと思います.
ただ,engines
を指定しなくても動いていたので,設定は必須ではないようです.
now のビルドコマンド等は Project Settings で設定できるようになっており,フレームワークプリセットを Nuxt に設定していれば
がデフォルトです.初期設定では Other になっており,nuxt build
or build
from package.json
がデフォルトです(自動で認識されたりされなかったり).build
or now-build
from package.json
if it exists
結論としては build
を正しく設定していれば now-build
は要らなそうです.
now.json
バージョン1と2で設定方法が異なります.
(追記 2020.12.28)
@nuxtjs/now-builder
から @nuxtjs/vercel-builder
に変更されました.
now.json
{
"version": 2,
"builds": [
{
"src": "nuxt.config.js",
"use": "@nuxtjs/vercel-builder",
}
]
}
ドキュメントの設定をそのまま使用しています.
デプロイ
now はコマンドでデプロイする他に,GitHub 等と連携させて master ブランチが更新されたときに自動的にデプロイする方法もあります.
両方試しましたが,どちらもビルドは成功し,ページは表示できませんでした.
エラーステータス
NO_STATUS_CODE_FROM_FUNCTION
エラー文と操作パネルの名称に整合性があるのかよくわかりませんが,プロジェクトの Functions タブ > Realtime Logs (Errors) でエラーが確認できます.
ビルドに成功しても 502 エラーで表示できない場合はこのタブからエラーが見られるようです.
内容を控えるのを忘れましたが,今回の場合はどうやらパッケージが見つからないようでした.
作成していた Web サイトでは SVG を表示するために nuxt-svg-loader を使用していました.ビルドだけでなく動作時にも必要になるパッケージのようですが,devDependencies
に指定されていたため,インストールされていませんでした.
dependencies
に移動させると起動できました.
最後に
Vercel は非常に便利だと思います.独自ドメインを指定することができますし,HTTPS も使用できます.デプロイも簡単です.
GitHub と連携して Push に合わせて自動ビルドすれば快適に SSG でサイトが作れます.
Node.js サーバが使える Heroku も SSR 等には便利ではありますが,独自ドメインを使用すると (自分で証明書を用意すれば可能だが) HTTPS が無料で利用できなかったり,一定時間接続がないとスリープしてしまったりするので,うん.
ただ,Vercel はエラーがよくわかりにくい気もします.深夜の作業で眠かったのかもしれませんが…