跳到主要内容

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 验证函数的输入,因为分配给参数的类型必须与生成的类型所期望的类型匹配。

© . All rights reserved.