メインコンテンツへスキップ

Prismaバリデーター

Prisma.validatorは、生成された型を受け取り、生成された型のモデルフィールドに準拠するタイプセーフなオブジェクトを返すユーティリティ関数です。

このページでは、Prisma.validatorを紹介し、それを使用する理由となるいくつかの動機を提供します。

注意: Prisma.validatorのユースケースがある場合は、新しいTypeScriptのsatisfiesキーワードを使用してPrisma Clientのワークフローを改善する方法に関するこちらのブログ記事を必ずご確認ください。Prisma.validatorを使用する代わりに、satisfiesをネイティブに使用してユースケースを解決できる可能性があります。

型付きクエリステートメントの作成

アプリケーション全体で異なるクエリで再利用したい新しいuserEmailオブジェクトを作成したと想像してみましょう。型付けされており、クエリで安全に使用できます。

以下の例では、Prismaidが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は、パラメーターに割り当てられた型が生成された型が予期するものと一致する必要があるため、関数の入力を検証します。