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
,然後使用用戶端擴充功能,以便獲得相同的行為。
例如,以下擴充功能將在 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)
},
},
},
})