😽

Prismaのバージョンを4.X系に上げたらいっぱいエラーでた

2022/12/17に公開

事の発端

とあるプロダクトの開発(Express + Prisma)にて、下記のようにCIが落ちてました。

$ prisma generate
Error: Unknown binaryTarget debian-openssl-3.0.x and no custom binaries were provided
error Command failed with exit code 1.

エラーの概要は、prisma generate コマンドを実行した際に、Unknown binaryTarget debian-openssl-3.0.x というエラーが発生し、コマンドが失敗したことを示すエラーみたいです。

こちらの解決方法としてはPrisma CLIのバージョンを上げるしかないようです。
この記事によると、該当するディレクトリにて下記のコマンドでバージョンアップを試みなきゃいけないそうですね。

npm install prisma --save-dev

npm install @prisma/client@dev prisma@dev

バージョンを上げたら........

Prsima seedコマンドがこけるようになってしまいました。

どうやらPrismaのバージョンを上げたことに伴ってseedコマンドの書き方を変える必要があったみたいです。
また、Prismaの依存関係であるts-nodeをinstallする必要があるそうです。

1. Open the package.json of your project
2. Add the following example to it:

"prisma": {
  "seed": "ts-node prisma/seed.ts"
}

If you are using ESM (ECMAScript modules):

"prisma": {
  "seed": "node --loader ts-node/esm prisma/seed.ts"
}

3. Install the required dependencies by running:
yarn add -D ts-node typescript @types/node

ここでは、きちんと対応方法をログに記載してくれてたので、その通りに修正してみました。

この時点で、buildはできるようになりました。

サーバ起動してみたら.......

さて実際に動作確認のため、サーバーを起動しようとしてみたら、、、、、、

08:39:59 Error: Debug Failure. False expression: Non-string value passed to `ts.resolveTypeReferenceDirective`, likely by a wrapping package working with an outdated `resolveTypeReferenceDirectives` signature. This is probably not a problem in TS itself.

上記のエラーが発生しました。
今回は、どうやらts-nodets-node-devというライブラリが関係している模様です。

【コラム】ts-nodeとts-node-devに関して

今回の開発にはts-nodeとts-node-devという二種類のライブラリがありました。
(上記のエラーはts-node-devが関係しているようでしたが、シンプルに気になったので軽く調べてみました。)

ts-nodeとは

ts-nodeとは、TypeScriptを実行できるNode.jsランタイムで、Node.jsで実行可能なTypeScriptのコードを簡単に実行できるみたいですね。

また、ts-nodeは実行時にTypeScriptをコンパイルするため、ソースコードを変更せずにソースコードを実行することもできます。

ts-node-devとは

ts-node-devとは、ts-nodeをベースに開発された開発用のツールで、ts-node-devは、ソースコードの変更を検出して、自動的にTypeScriptをコンパイルし、ts-nodeで実行してくれる超優れものです。

開発時にソースコードの変更を検知して、自動的にソースコードを実行することで、開発効率を改善することができます。

ts-node-devとts-nodeに関するエラーについて

08:39:59 Error: Debug Failure. False expression: Non-string value passed to `ts.resolveTypeReferenceDirective`, likely by a wrapping package working with an outdated `resolve

改めて、エラーの内容を掲載しておきます。

エラーの詳細を簡単に説明すると、ts.resolveTypeReferenceDirectiveに文字列以外の値が渡ったことが原因みたいです。
詳しい解決方法としては、TypeScript自体ではなく、TypeScript関連のパッケージのバージョンを上げる必要があるみたいです。
それが今回はts-nodets-node-devということでした。

なので、ts-nodeもts-node-devも最新版にバージョンアップし、無事解決しました。
こちらから引用

# With NPM
npm install ts-node-dev@latest ts-node@latest

# With yarn
yarn upgrade ts-node-dev@latest ts-node@latest

Prisma migrationが通らなくなった......

最後に動作確認前にprisma migrationを実行したところ下記のような警告文言が表示されました。

prisma:warn `rejectOnNotFound` option is deprecated and will be removed in Prisma 5. Please use `prisma.invitation.findFirstOrThrow` method instead.

どうやらPrisma 5で、rejectOnNotFoundオプションが非推奨で削除され、代わりにprisma.invitation.findFirstOrThrowメソッドを使用が推奨されているみたいです。

- await client().invitation.findFirst({ 
-	rejectOnNotFound: true
- })

+ await client().invitation.findFirstOrThrow({ ... })
export function client(): PrismaClient {
  if (_client) return _client;
  const prisma = new PrismaClient({
    datasources: {
      db: {
        url: CONFIG.postgresql.databaseUrl,
      },
    },
-   rejectOnNotFound: true,
  });

やっとmigrationも通り、動作確認もできました🙌

最後に

Prismaはまだまだ日本語ソースの少ない技術なので、少しでも誰かの役に立てたらなと思います。

Discussion