Prismaバリデーター
Prisma.validator
は、生成された型を受け取り、生成された型のモデルフィールドに準拠するタイプセーフなオブジェクトを返すユーティリティ関数です。
このページでは、Prisma.validator
を紹介し、それを使用する理由となるいくつかの動機を提供します。
注意:
Prisma.validator
のユースケースがある場合は、新しいTypeScriptのsatisfies
キーワードを使用してPrisma Clientのワークフローを改善する方法に関するこちらのブログ記事を必ずご確認ください。Prisma.validator
を使用する代わりに、satisfies
をネイティブに使用してユースケースを解決できる可能性があります。
型付きクエリステートメントの作成
アプリケーション全体で異なるクエリで再利用したい新しい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
オブジェクトで使用可能なすべてのプロパティにアクセスできるようになります。
これを1つのファイルで使用している場合は問題ないかもしれませんが、このオブジェクトをエクスポートして他のクエリで使用する場合、またはユーザーがクエリ内でこのオブジェクトをどのように使用するかを制御したい外部ライブラリをコンパイルする場合は、型安全ではありません。
オブジェクト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
は、パラメーターに割り当てられた型が生成された型が予期するものと一致する必要があるため、関数の入力を検証します。