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

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は関数の入力を検証します。

© . All rights reserved.