January 18, 2024
前回の記事では、スキーマの概念について説明しました。ここでは、User と Post の 2 つのタイプを定義し、それらの間の関係を確立しました。この記事では、この関係を解決するのに役立つ関数またはリゾルバーの実装について詳しく説明します。
リゾルバーは、スキーマの単一フィールドにデータを入力する関数です。
GraphQLでは、リゾルバーはスキーマ内の特定のフィールドのリクエストへの応答方法を定義する一連の関数です。GraphQL クエリが実行されると、クエリの各フィールドは対応するリゾルバー関数によって解決されます。
リゾルバー関数には通常、次のシグネチャがあります。
fieldName: (parent, args, context, info) => data;
引数のない基本的なリゾルバーの実装を始めましょう。
この例では、配列オブジェクトからすべての投稿を返すリゾルバーを実装しています。
// we are importing data from a util file
import {users, posts, users_posts} from "../../utils/data"
const resolvers = {
Query: {
posts: () => {
return posts; // resolver return the posts array
}
}
}
export default resolvers;
以下に基づいてユーザーを取得する get user リゾルバーを実装します ID ユーザーの、ユーザーとその投稿を返す
// args object is used to pass user id i.e. defined in query
getUser: (_parent: any, args: any, _context: any) => {
if (args?.id) {
//search the user based on user id in users array
const searchedUser: any = users.find(user => user?.id == args?.id)
// search the posts written by the user
const userPostRelationships = users_posts?.filter(rel => rel?.userId === searchedUser?.id);
const userPostIds = userPostRelationships.map(rel => rel?.postId);
// combine the result and return
searchedUser['posts'] = posts.filter(post => userPostIds.includes(post?.id));
return searchedUser;
} else {
return new Error("ID is required");
}
}
ユーザーから提供されたIDに基づいて投稿を更新するミューテーションリゾルバーを実装します
Mutation: {
updatePost: (_parent: any, args: any, _context: any) => {
if (args?.id) {
// search the post
const post: any = posts.find(p => p?.id == args?.id)
//update the post if post exist
if (post) {
post.title = args?.title ?? post?.title;
post.content = args?.content ?? post?.content;
//return updated post
return post;
} else {
return new Error("Post not found with the provided id");
}
} else {
return new Error("ID is required")
}
}
}
GraphQL リゾルバーは API を活気づけるための主力製品です。パフォーマンスが高くスケーラブルな GraphQL サービスを構築するには、それらを効率的に作成する方法を理解することが重要です。ここで紹介した例を読めば、リゾルバー関数の複雑さを深く理解し、GraphQL の開発スキルを高めるための基礎が身につきました。ハッピーコーディング!