Closed2

PrismaClientInitializationErrorが起きて環境変数を読み込めない

ioio

エラー概要

個人開発でPrismaを使っている中で、以下のエラーが発生しました。

PrismaClientInitializationError: error: Environment variable not found: DATABASE_URL.
  -->  schema.prisma:7
   |
 6 |   provider = "mysql"
 7 |   url      = env("DATABASE_URL")
   |

.envは何度確認しても正しく書かれていたため、Prisma周りの設定ミスだと考えました。
npx prisma generateを実行した際、prisma@5.14.0@prisma/client@5.16.1のバージョンが一致していないという警告が表示されていたことに気がつきました。

npx prisma generate
Environment variables loaded from .env
Prisma schema loaded from backend/prisma/schema.prisma

✔ Generated Prisma Client (v5.16.1) to ./node_modules/@prisma/client in 50ms

warn Versions of prisma@5.14.0 and @prisma/client@5.16.1 don't match.
This might lead to unexpected behavior.
Please make sure they have the same version.

解決方法

PrismaとPrisma Clientのバージョンを固定で一致させたところ、エラーは発生しなくなりました。
チームで開発していると、依存関係のバージョンがバラバラになりやすいことがあります。今回は以下のようなpackage.jsonの記述が原因でバージョンが一致しませんでした。

  "dependencies": {
    "@prisma/client": "^5.16.1",
    "prisma": "^5.12.1",
  },

固定バージョンを利用するなど、チームでコミュニケーションをとって依存関係をケアすることが重要だと感じました。

"dependencies": {
  "@prisma/client": "5.16.1",
  "prisma": "5.16.1"
}
ioio

解決方法(2024/8/11 追記)

上記の設定を行ったにも関わらず、再度エラーが発生しました。

環境変数が読み込めていない

echo $DATABASE_URLを打つと何も返ってこない、つまり環境変数が読み込まれていない状態でした。
そこで、以下をコマンドを打って指定された ./backend/.env ファイルに書かれた環境変数を一括で読み込み、現在のシェルセッションにエクスポートしました。

export $(grep -v '^#' ./backend/.env | xargs)

Prismaが入れ子の変数を置き換えてくれない

再度試すと環境変数を読み込むことができるようになりましたが、入れ子の変数が置き換えられずにそのまま読み込まれている状態でした。

echo $DATABASE_URL
mysql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}

応急処置として、.envDATABASE_URLを変数を使わずにベタ書きすることでnestが起動するようになりました。

このスクラップは4ヶ月前にクローズされました