跳到主要內容

Prisma validator

Prisma.validator 是一個實用函式,它接收一個生成的型別,並返回一個符合該生成型別模型欄位的型別安全物件。

本頁面介紹了 Prisma.validator,並解釋了你可能選擇使用它的原因。

注意: 如果你有使用 Prisma.validator 的場景,請務必檢視這篇部落格文章,瞭解如何利用新的 TypeScript satisfies 關鍵字改進你的 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 建立的,並傳遞了一個生成的型別 UserCreateInputPrisma.validator 驗證函式的輸入,因為分配給引數的型別必須與生成的型別所期望的型別匹配。

© . This site is unofficial and not affiliated with Prisma Data, Inc.