rejectOnNotFound の変更
Prisma ORM バージョン 5.0.0 以降、非推奨となったパラメータ rejectOnNotFound
は削除されました。プロジェクトで rejectOnNotFound
をクエリごとまたはグローバルに使用していたかによって、コードを更新する方法が異なります。
クエリごとに rejectOnNotFound
パラメータを使用している場合は、「クエリレベルでコードを更新する」の手順に従ってください。
代わりにクライアントレベルで rejectOnNotFound
パラメータを設定している場合は、「クライアントレベルでコードを更新する」の手順に従う必要があります。
Prisma ORM 5 の変更点の完全なリストは、リリースノートに記載されています。
クエリレベルで有効になっている rejectOnNotFound
の置き換え
以前にクエリごとに rejectOnNotFound
を有効にしていた場合は、クエリレベルで使用箇所を置き換える必要があります。findFirst
および findUnique()
にパラメータを指定する代わりに、*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
に更新し、同じ動作を実現するためにクライアント拡張機能を使用する必要があります。
例として、次の拡張機能は、Prisma ORM 5 で Prisma ORM 4 以前の Example 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)
},
},
},
})