跳到主内容

`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 Client 构造函数使用 `rejectOnNotFound`

如果你之前通过在 Prisma Client 构造函数中配置全局启用了 `rejectOnNotFound`,如下例所示

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

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

你将需要更新你的代码库,以使用 `findUniqueOrThrow` 和 `findFirstOrThrow` 替代 `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`,然后使用客户端扩展 (Client Extension) 以获得相同的行为。

举例来说,以下扩展会在 Prisma ORM 5 中提供与 `Example 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)
},
},
},
})