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)
},
},
},
})