表題の通りなのですが、以下のようなgraphqlクエリをクライアントから発行します
query { users { id, name, pictures(first: 1) { id } } }
上記クエリでは、「ユーザーの一覧をそのユーザーがも所有する写真一覧と一緒に取得するが、写真は最初の1枚だけを抽出」を要求しております。
このリクエスト時の「forst: 1」は以下のように定義しております。
import { GraphQLObjectType, GraphQLString, GraphQLList, GraphQLInt } from "graphql"; import { PictureType } from "./picture.type"; class User { public name: string = 'user_schama'; public fields = () => { return { id: { type: GraphQLString }, name: { type: GraphQLString }, pictures: { type: GraphQLList(PictureType), args: { first!: { type: GraphQLInt }, last!: { type: GraphQLInt } } } } } } export const UserType = new GraphQLObjectType(new User());
上記スキーマは以下のようにresolverでreturnされます。
import { GraphQLList, GraphQLInt } from "graphql"; import { UserType } from "../types"; import { FakeDatabaseKeyType } from "../types/fakeDatabase.type"; import { GraphQLQuery } from "./query.interface"; export class UsersQuery implements GraphQLQuery { protected fakeDatabase: FakeDatabaseKeyType = {} constructor (fakeDatabase: FakeDatabaseKeyType) { this.fakeDatabase = fakeDatabase } public type = new GraphQLList(UserType); public description: string = "List of all Users"; public resolve = () => { // TODO userスキーマのpictureに指定したargs(firstとか)どうやって取得すんの? // 上記が解決したら、cursor、edge、nodeの実装に移る return Object.keys(this.fakeDatabase).map(id => { const fakeDatabase = this.fakeDatabase return { id, name: fakeDatabase[id].name, pictures: fakeDatabase[id].pictures } }) } }
typeに先ほどのusersスキーマが定義されてます。
これらは最終的に
class Query { public name = "Query"; public fields = () => { return { user: new UserQuery(fakeDatabase), users: new UsersQuery(fakeDatabase) } } } ... 省略 ... export const schema = new GraphQLSchema({ query: new GraphQLObjectType(new Query()), mutation: new GraphQLObjectType(new Mutation()) });
このような感じでqueryに設定しております。
上記の構成の場合、先の「first: 1」はresolverであるUsersQueryのresolveの中で取得したいのですが、どのように取得できますでしょうか?
GraphQLもexpress-graphqlも初学であり、そもそも勘違いしているなどもあるかもしれませんが、お知恵をお借りできればと存じます。
あなたの回答
tips
プレビュー