Prismaのバージョンを4.X系に上げたらいっぱいエラーでた
事の発端
とあるプロダクトの開発(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-node
とts-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-node
とts-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