跳到主要内容

rejectOnNotFound 变更

从 Prisma ORM 5.0.0 版本开始,已移除弃用的参数 rejectOnNotFound。根据您的项目是按查询还是全局使用 rejectOnNotFound,更新代码的方式会有所不同。

如果您在每个查询的基础上使用 rejectOnNotFound 参数,请按照我们的步骤 在查询级别更新您的代码

如果您在客户端级别设置了 rejectOnNotFound 参数,您需要按照 在客户端级别更新代码的步骤 进行操作。

Prisma ORM 5 变更的完整列表可以在我们的发行说明中找到

替换在查询级别启用的 rejectOnNotFound

如果您之前在每个查询的基础上启用了 rejectOnNotFound,您需要在查询级别替换您的用法。您可以使用我们的 *OrThrow 查询变体,findFirstOrThrowfindUniqueOrThrow,而不是为 findFirstfindUnique() 提供参数。

简单的 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,
},
})

您需要更新您的代码库以使用 findUniqueOrThrowfindFirstOrThrow,而不是 findUnique()findFirst,具体取决于您希望哪些调用抛出错误。

通过带有自定义错误处理程序的 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)
},
},
},
})