メインコンテンツにスキップ

rejectOnNotFound の変更点

Prisma ORM バージョン 5.0.0 以降、非推奨のパラメータ rejectOnNotFound は削除されました。プロジェクトがクエリごとに、またはグローバルに rejectOnNotFound を使用していたかどうかに応じて、コードを更新する方法が異なります。

rejectOnNotFound パラメータをクエリごとに使用している場合は、クエリレベルでコードを更新する手順に従ってください。

代わりに、rejectOnNotFound パラメータをクライアントレベルで設定している場合は、クライアントレベルでコードを更新する手順に従う必要があります。

Prisma ORM 5 の変更点の全リストは、リリースノートで確認できます。

クエリレベルで有効化された rejectOnNotFound の置き換え

以前に rejectOnNotFound をクエリごとに有効にしていた場合は、その使用箇所をクエリレベルで置き換える必要があります。findFirstfindUnique() にパラメータを供給する代わりに、*OrThrow クエリバリアントである findFirstOrThrow または findUniqueOrThrow を使用できます。

シンプルな rejectOnNotFound の使用

次の例

prisma.user.findFirst({
where: { name: 'Alice' },
rejectOnNotFound: true,
})

に変換する必要があります。

prisma.user.findFirstOrThrow({
where: { name: 'Alice' },
})

カスタムエラーハンドラと組み合わせた rejectOnNotFound の使用

次のようなカスタムエラーハンドラを使用している場合

prisma.user.findFirst({
where: { name: 'Alice' },
rejectOnNotFound: () => new UserNotFoundError(),
})

...OrThrow メソッドによってスローされるエラーを処理するようにコードを変更する必要があります。

try {
await prisma.user.findFirstOrThrow({
where: { name: 'Alice' },
})
} catch (err) {
if (err.code === 'P2025') {
throw new UserNotFoundError()
}
throw err
}

エラーハンドラが複数の場所で使用されている場合は、再利用可能なエラーアダプターを作成し、それを関数の .catch() 内で使用することもできます。

const adaptError = (customThrowFn) => (error) => {
if (error.code === 'P2025') {
throw customThrowFn()
}
throw error
}

const user = await prisma.user.findFirstOrThrow({
where: { name: 'Alice' },
}).catch(adaptError(() => new MyCustomError())

クライアントレベルで有効化された rejectOnNotFound の置き換え

Prisma Client コンストラクターを介した rejectOnNotFound

以前に Prisma Client コンストラクターの構成によって rejectOnNotFound をグローバルに有効にしていた場合(これらの例のように)

// Example 1
const prisma = new PrismaClient({
rejectOnNotFound: true,
})

// Example 2
const prisma = new PrismaClient({
rejectOnNotFound: {
findUnique: true,
},
})

スローしたい呼び出しに応じて、findUnique() および findFirst の代わりに findUniqueOrThrow および findFirstOrThrow を使用するようにコードベースを更新する必要があります。

カスタムエラーハンドラ付きPrisma Client コンストラクターを介した rejectOnNotFound

代わりに、これらの例のように rejectOnNotFound プロパティを持つカスタムエラーハンドラを使用している場合

// Example 3
const prisma = new PrismaClient({
rejectOnNotFound: (err) => new Error('something'),
})

// Example 4
const prisma = new PrismaClient({
rejectOnNotFound: {
findUnique: (err) => new Error('something'),
},
})

// Example 5
const prisma = new PrismaClient({
rejectOnNotFound: {
findFirst: {
User: (err) => new Error('User error'),
Post: (err) => new Error('Post error'),
},
findUnique: {
User: (err) => new Error('User error'),
Post: (err) => new Error('Post error'),
},
},
})

同じ動作を得るには、メソッドの使用法を ...OrThrow に更新し、その後 Client Extension を使用する必要があります。

例として、以下の拡張機能は、Prisma ORM 4 以前で Example 5 が提供していたものと同じ動作を Prisma ORM 5 で提供します。

import { PrismaClient } from '@prisma/client';

const customErrorFunc = async (model, query, args) => {
try {
await query(args)
} catch (error: any) {
if (error.code === 'P2025') {
throw new Error(`${model} error`)
}
throw error;
}
}

const prisma = (new PrismaClient()).$extends({
query: {
user: {
async findFirstOrThrow({ model, query, args }) {
return await customErrorFunc(model, query, args)
},
async findUniqueOrThrow({ model, query, args }) {
return await customErrorFunc(model, query, args)
},
},
post: {
async findFirstOrThrow({ model, query, args }) {
return await customErrorFunc(model, query, args)
},
async findUniqueOrThrow({ model, query, args }) {
return await customErrorFunc(model, query, args)
},
},
},
})
© . All rights reserved.