Prisma 驗證器
Prisma.validator
是一個實用工具函式,它接受產生的類型,並傳回一個類型安全的物件,該物件符合產生的類型模型欄位。
本頁介紹 Prisma.validator
,並提供您可能選擇使用它的動機。
注意:如果您有
Prisma.validator
的使用案例,請務必查看這篇關於使用新的 TypeScriptsatisfies
關鍵字改進您的 Prisma Client 工作流程的部落格文章。您很可能可以使用satisfies
而不是使用Prisma.validator
原生地解決您的使用案例。
建立類型化的查詢語句
假設您建立了一個新的 userEmail
物件,您想要在整個應用程式的不同查詢中重複使用它。它已類型化,可以安全地在查詢中使用。
以下範例要求 Prisma
傳回 id
為 3 的使用者的 email
,如果使用者不存在,則傳回 null
。
import { Prisma } from '@prisma/client'
const userEmail: Prisma.UserSelect = {
email: true,
}
// Run inside async function
const user = await prisma.user.findUnique({
where: {
id: 3,
},
select: userEmail,
})
這運作良好,但以這種方式提取查詢語句有一個注意事項。
您會注意到,如果您將滑鼠懸停在 userEmail
上,TypeScript 不會推斷物件的鍵或值(即 email: true
)。
如果您在 prisma.user.findUnique(...)
查詢中使用點表示法在 userEmail
上,情況也是如此,您將能夠存取 select
物件可用的所有屬性。
如果您在一個檔案中使用它,這可能還可以,但如果您要匯出此物件並在其他查詢中使用它,或者如果您要編譯一個外部函式庫,並且想要控制使用者如何在他們的查詢中使用此物件,那麼這將不是類型安全的。
物件 userEmail
已被建立為僅選擇使用者的 email
,但它仍然可以存取所有其他可用的屬性。它是類型化的,但不是類型安全的。
Prisma
有一種驗證產生的類型以確保它們是類型安全的方法,這是一個在命名空間上可用的實用工具函式,稱為 validator
。
使用 Prisma.validator
以下範例將 UserSelect
產生的類型傳遞到 Prisma.validator
實用工具函式中,並以與先前範例非常相似的方式定義預期的傳回類型。
import { Prisma } from '@prisma/client'
const userEmail: Prisma.UserSelect = {
email: true,
}
const userEmail = Prisma.validator<Prisma.UserSelect>()({
email: true,
})
// Run inside async function
const user = await prisma.user.findUnique({
where: {
id: 3,
},
select: userEmail,
})
或者,您可以使用以下語法,該語法使用「選擇器」模式,使用 Prisma Client 的現有實例
import { Prisma } from '@prisma/client'
import prisma from './lib/prisma'
const userEmail = Prisma.validator(
prisma,
'user',
'findUnique',
'select'
)({
email: true,
})
最大的不同是 userEmail
物件現在是類型安全的。如果您將滑鼠懸停在其上,TypeScript 會告訴您物件的鍵/值對。如果您使用點表示法來存取物件的屬性,您將只能存取物件的 email
屬性。
當與使用者定義的輸入(如表單資料)結合使用時,此功能非常方便。
將 Prisma.validator
與表單輸入結合使用
以下範例從 Prisma.validator
建立一個類型安全的函式,該函式可以在與使用者建立的資料(例如表單輸入)互動時使用。
注意:表單輸入在執行時確定,因此僅使用 TypeScript 無法驗證。在將資料傳遞到資料庫之前,請務必也透過其他方式(例如外部驗證函式庫)驗證您的表單輸入。
import { Prisma, PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
// Create a new function and pass the parameters onto the validator
const createUserAndPost = (
name: string,
email: string,
postTitle: string,
profileBio: string
) => {
return Prisma.validator<Prisma.UserCreateInput>()({
name,
email,
posts: {
create: {
title: postTitle,
},
},
profile: {
create: {
bio: profileBio,
},
},
})
}
const findSpecificUser = (email: string) => {
return Prisma.validator<Prisma.UserWhereInput>()({
email,
})
}
// Create the user in the database based on form input
// Run inside async function
await prisma.user.create({
data: createUserAndPost(
'Rich',
'rich@boop.com',
'Life of Pie',
'Learning each day'
),
})
// Find the specific user based on form input
// Run inside async function
const oneUser = await prisma.user.findUnique({
where: findSpecificUser('rich@boop.com'),
})
createUserAndPost
自訂函式是使用 Prisma.validator
建立的,並傳遞產生的類型 UserCreateInput
。Prisma.validator
驗證函式的輸入,因為指派給參數的類型必須與產生的類型預期的類型相符。