これは何
axios のクライアント側エラー処理を書く時にはまったところについて共有のための記事です。
process.client
は使えないので、そもそもクライアント用とサーバ用でファイルを分けようという話です。
バージョン情報
{
"nuxt": "^2.11.0",
"@nuxt/typescript-build": "^0.5.2",
"@nuxt/typescript-runtime": "^0.3.3",
"@nuxtjs/axios": "^5.9.5"
}
トラブルについて
クライアントサイドでその処理が実行されるか、というのを制御できるprocess.client
プロパティがnuxtアプリケーションではよく使われます。
plugins読み込みの時にはこのプロパティが設定されていないのでundefined
になってしまいます。
if (process.client) {
// 何か処理
}
と書くと、一見動くように見えるのですが、実際にはprocess.client
がundefined
になるのでifの中の処理は常に実行されませんでした。
具体的に起こった問題は以下のようなもの
- サーバ側処理もクライアント側処理も同じプラグインファイルに書いていた
- クライアント側の処理をして問題なければ
return
して処理おわり、その後にサーバサイドの処理をして問題あればnuxt error
を吐くみたいな処理を書いていた - そもそもifに入っていないので
return
で処理が止まらず、クライアント側のクライアントエラー(4xx)でもnuxt error
を吐いて死んでしまう
解決策
clientとserverでそれぞれ実行する処理をファイル名を分けて、それぞれnuxt設定ファイルで読み込みます。
plugins: [
'@/plugins/axios.client.ts',
'@/plugins/axios.server.ts',
],
他にもmode
を書く方法もあるようですが、ファイル名だけをみた時にどちらで実行されるのか?というのがはっきり分かるので、ファイル名で分けたほうが個人的にはいいかなと思います。
補足
process.client
は undefined
になってしまうのですが、process
オブジェクト自体は定義されているようでした。
これはnuxtがnodejsのインターフェースの拡張しているもののようです。
plugin のなかで console.log(process);
すると以下のようになりました。
.browser
を使えばフロントかサーバかの判定はできるようですが、すでにnuxtでは非推奨になっていました。
参考
https://ja.nuxtjs.org/api/configuration-plugins
https://ja.nuxtjs.org/guide/plugins/
https://stackoverflow.com/questions/58146662/process-server-is-undefined-in-nuxt-js-modules