rejectOnNotFound 更改
从 Prisma ORM 5.0.0 版本开始,已弃用的参数 rejectOnNotFound
已被移除。根据您的项目是按查询使用 rejectOnNotFound
还是全局使用,更新代码的方式会有所不同。
如果您在每个查询的基础上使用 rejectOnNotFound
参数,那么请按照我们的步骤进行 更新查询级别的代码。
如果您在客户端级别设置了 rejectOnNotFound
参数,则需要按照 更新客户端级别代码的步骤。
可以在 我们的发布说明中找到 Prisma ORM 5 的所有更改。
替换在查询级别启用的 rejectOnNotFound
如果您之前在每个查询的基础上启用了 rejectOnNotFound
,则需要在查询级别替换您的使用方式。您可以使用我们的 *OrThrow
查询变体,findFirstOrThrow
或 findUniqueOrThrow
,而不是向 findFirst
和 findUnique()
提供参数。
简单的 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 客户端构造函数使用 rejectOnNotFound
如果您之前通过 Prisma 客户端构造函数中的配置在全局范围内启用了 rejectOnNotFound
,例如在以下示例中
// Example 1
const prisma = new PrismaClient({
rejectOnNotFound: true,
})
// Example 2
const prisma = new PrismaClient({
rejectOnNotFound: {
findUnique: true,
},
})
您需要更新您的代码库以使用 findUniqueOrThrow
和 findFirstOrThrow
来代替 findUnique()
和 findFirst
,这取决于您希望哪些调用抛出错误。
带有自定义错误处理程序的 Prisma 客户端构造函数中的 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 中与 示例 5
在 Prisma ORM 4 及更低版本中相同的行为。
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)
},
},
},
})