Blogs

グラフィカルリゾルバー

January 18, 2024

前回の記事では、スキーマの概念について説明しました。ここでは、User と Post の 2 つのタイプを定義し、それらの間の関係を確立しました。この記事では、この関係を解決するのに役立つ関数またはリゾルバーの実装について詳しく説明します。

リゾルバーとは

リゾルバーは、スキーマの単一フィールドにデータを入力する関数です。

GraphQLでは、リゾルバーはスキーマ内の特定のフィールドのリクエストへの応答方法を定義する一連の関数です。GraphQL クエリが実行されると、クエリの各フィールドは対応するリゾルバー関数によって解決されます。

リゾルバーの主な引数

リゾルバー関数には通常、次のシグネチャがあります。

fieldName: (parent, args, context, info) => data;
  1. 親: 親リゾルバーから返された結果を含むオブジェクト
  2. 引数: クエリのフィールドに渡される引数を含むオブジェクト
  3. 状況: これは、特定のクエリのすべてのリゾルバーが共有するオブジェクトです。
  4. 情報: クエリに関連するフィールド固有の情報

ベーシックリゾルバー

引数のない基本的なリゾルバーの実装を始めましょう。
この例では、配列オブジェクトからすべての投稿を返すリゾルバーを実装しています。

// 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 の開発スキルを高めるための基礎が身につきました。ハッピーコーディング!