Probmkr
@Probmkr (Probmkr)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Next.js で正しくローカルで 80 番ポートで動かす方法(または、 TypeError: Cannot read properties of null (reading 'useEffect'))

解決したいこと

最近、 Next.js を使ってウェブアプリを作っています。開発環境では 3002 番ポートを使用して、全て正常に動いていました。

ですが、それを 80 番ポートで sudo next start -p 80 というコマンドを使って起動すると謎のエラーを吐くようになりました。

多分ローカルでの 80 番ポートでの公開の仕方が違うのだと思い、「next.js 80 port」などとググってみましたが、何一つ 80 番ポートでサーバーを建てるという記事がありませんでした。なので、ここで質問させてみました。

環境

  • Ubuntu 20.04
  • nodejs 16.15.1
  • npm 8.11.0
  • next 12.1.6
  • react 18.1.0

テスト環境 URL:
http://apps.probmkr.com:3002/

GitHub レポジトリ:
https://github.com/Probmkr/test_next_project

発生している問題・エラー

TypeError: Cannot read properties of null (reading 'useEffect')
    at Object.exports.useEffect (/var/www/test_next_project/node_modules/react/cjs/react.production.min.js:24:292)
    at NextNProgress (/var/www/test_next_project/node_modules/nextjs-progressbar/dist/index.js:1:1005)
    at renderWithHooks (/usr/local/lib/node_modules/next/node_modules/react-dom/cjs/react-dom-server.browser.development.js:5471:16)
    at renderIndeterminateComponent (/usr/local/lib/node_modules/next/node_modules/react-dom/cjs/react-dom-server.browser.development.js:5544:15)
    at renderElement (/usr/local/lib/node_modules/next/node_modules/react-dom/cjs/react-dom-server.browser.development.js:5759:7)
    at renderNodeDestructive (/usr/local/lib/node_modules/next/node_modules/react-dom/cjs/react-dom-server.browser.development.js:5898:11)
    at renderNode (/usr/local/lib/node_modules/next/node_modules/react-dom/cjs/react-dom-server.browser.development.js:6030:12)
    at renderChildrenArray (/usr/local/lib/node_modules/next/node_modules/react-dom/cjs/react-dom-server.browser.development.js:5986:7)
    at renderNodeDestructive (/usr/local/lib/node_modules/next/node_modules/react-dom/cjs/react-dom-server.browser.development.js:5918:7)
    at renderElement (/usr/local/lib/node_modules/next/node_modules/react-dom/cjs/react-dom-server.browser.development.js:5784:9)

スクリーンショット 2022-06-06 23.35.19.png

エラーを再現

上のエラーは、下のシェルスクリプトを master ブランチで ./buildrun.sh として走らせた時に建てた本番環境サーバーで起きます。(buildrun.sh のファイル自体は、レポジトリのルートにあります。)

もっと詳しく言えばその本番環境で /admin にアクセスするとおきます。

#buildrun.sh
#!/bin/bash

yarn install
sudo yarn build
if [ $? != "0" ]; then
    exit 1
fi

screen -ls builded > /dev/null
if [ $? == "0" ]; then
    screen -S builded -X quit
fi

read -p "enter to continue: "
screen -UAmdS builded sudo next start -p ${1:-80}
screen -ls

read -p "do you want to attach? (y:any): " attach

if [ "$attach" == "y" ]; then
    screen -r builded
fi

# このスクリプトでは簡単に言えば sudo next build でビルドして、 
# sudo next start -p 80 でサーバーを screen を使ってバックグラウンドでスタートさせます。

このエラーは yarn devnext dev -p 3002)した時には起きることはありません。

自分で試したこと

必死でググりましたが、全く分かりませんでした。
そもそも、 /admin の中では全く useEffect を使ってないのでエラーについて何もかもわかりませんでした。

0

1Answer

手元のWSL+Ubuntu22.04環境下で,ホームディレクトリに構築した感じでは再現しませんでした.
port80でのサーバーオープンにあたってはこちらを参考にしてみました.

どこかしらでsudoしたせいで変なことになってるのかもしれません.
使用環境と詳細なビルド手順を補足いただけますか?

1Like

Comments

  1. @Probmkr

    Questioner

    あ、実はこちらのエラーは解決しませんでしたが、他の方法で代用できました。
    一応、その他の方法というのは、 80 番ポートに来た通信を iptables でルート権限がなくても Listen できるポートに転送するという方法でした。
    回答していただきありがとうございました。
    わざわざお時間かけてすみません。

    一応、私の考察としては、ルート権限で使用した時とノーマルユーザーで使用した時に参照しているライブラリに差があるからというものです。
  2. そもそもsuperuserでnpmを動かすのはいろいろよろしくないみたいです.
    https://stackoverflow.com/questions/40525238/run-npm-as-superuser-it-isnt-a-good-idea

    他のサーバープログラムであっても,バックエンドが特権付きで動いているとフロントエンドから変なことをされたとき危ないので(ましてadminメニューみたいなことができるWebアプリなので),通常ユーザーで動かすのを推奨します.
  3. @Probmkr

    Questioner

    一応報告ですが、その後、 sudo 権限のない通常ユーザーで動かすことにしましたのでご安心ください。

Your answer might help someone💌