実践Next.js —— App Routerで進化するWebアプリ開発
6章のPrisma周りのエラーにハマったので同じような人向けにその解消方法を備忘録として残す。
マイグレーション
applications/packages/sns-web-2
の環境構築のため
$ npm run db-migrate-dev
マイグレーションコマンドを実行したところ以下のようなエラーが出た。
Error: P1010: User `root` was denied access on the database `app-db.public
権限周りが原因だと思い、docker内部でpostgresを起動しrootユーザを作成、権限付与など色々いじっていたが真因は既にローカル上でpostgresがデフォルトポート5432で起動していたためdocker上ではなくローカル上のpostgresに向けてコマンドが実行されていたことがエラーの原因であった。ローカルのpostgresをkillして解決。
上記を解決した上でもう一度マイグレーションコマンドを実行したところ次のようなエラーが出た。
Error: @prisma/client did not initialize yet. Please run "prisma generate" and try to import it again.
解消方法は以下のコマンドを実行してprismaクライアントを作成すればok
$ npx prisma generate
クライアント作成後、再度マイグレーションコマンドを実行したところ、正常に実行され解決。
ハマったところ
結論から言うと、モノレポ構成についてとprismaについての二つの知識が欠けていたのでエラー解消に時間がかかった。
モノレポではサブディレクトリ側にnode_modulesが作成されないので、そのような状態でもエイリアスが正しく効くのか疑っていた。
また自身のnode_modulesの方を参照する
applications/packages/sns-api-2
の方は正常にマイグレーションが実行され、かつnpm run
でTabの補完が効く一方、sns-web-2ではTabの補完が効かなかったのでモノレポ構成に関する設定に誤りがあるのではないかと疑っていた。
エラーの再現性
なぜこのエラーが起きたのか原因を特定したくて、applicationsディレクトリを削除後、
再度クローンして手順通りにコマンドを実行して再現しようとしたが、同じエラーは発生しなかった。(何それ怖い)
ローカルのポート5432が被っていた状況は再現してないのでそれが関係するかもしれない。また初回では操作ミスで余計にnpm installを実行していたので、そのせいかもしれない。
prismaについて調べてわかったこと
正常にマイグレーションが実行されると
node_modules/.prisma/client/schema.prisma
にスキーマファイルが作成される。
sns-api-2だけモノレポ構成から外している理由は同一のprismaを参照している場合、後発の
prisma migrate dev
によってnode_modules/.prisma
配下のスキーマファイルの内容が上書きされてしまうからだと考えられる。
そう考える理由はsns-web-2の方はnpm install
するが、sns-api-2の方はnpm install
しない状態でsns-web-2のディレクトリでnpm run db-migrate-dev
を実行applications/node_modules/.prisma
配下にsns-web-2側の設定でスキーマファイルが完成されるのを確認した後、sns-api-2のディレクトリでnpm run db-migrate-dev
を実行したところ、親ディレクトリのprismaが呼び出されているらしく、マイグレーションが実行され
applications/node_modules/.prisma/client/schema.prisma
がsns-api-2側の設定で上書きされる挙動をしたことに偶然気づいたからだ。
以上、誰かの役に立てば幸いである。