Prisma 验证器
该 Prisma.validator
是一个实用程序函数,它接受一个生成的类型并返回一个类型安全的对象,该对象符合生成的类型模型字段。
此页面介绍了 Prisma.validator
并提供了一些关于您可能选择使用它的动机的说明。
注意:如果您有
Prisma.validator
的用例,请务必查看这篇关于使用新的 TypeScriptsatisfies
关键字改进 Prisma Client 工作流程的博文。您很可能可以使用satisfies
本地解决您的用例,而不是使用Prisma.validator
。
创建类型化查询语句
假设您创建了一个新的 userEmail
对象,您希望在整个应用程序的不同查询中重复使用它。它是类型化的,可以在查询中安全使用。
以下示例要求 Prisma
返回 id 为 3 的用户的电子邮件,如果不存在用户,则返回 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',
'[email protected]',
'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('[email protected]'),
})
createUserAndPost
自定义函数是使用 Prisma.validator
创建的,并传递了一个生成的类型 UserCreateInput
。Prisma.validator
验证函数的输入,因为分配给参数的类型必须与生成的类型期望的类型匹配。