GraphQLのResolver
どのようにデータを取得してきて、定義したSchema (src/schema.js) の形式と型で返すかを定義する
特定のフィールドのデータを返す関数
スキーマで指定されたとおりのデータを返す
非同期で処理できる
REST API、DBなどのサービスからデータを取得したり更新したりできる
これの書き方次第でパフォーマンスに影響する
一つのフィールドの取得に時間がかかると全体に影響が出る
primitiveなところは別によいのか?
その関数のinterfaceは決まっている
code:resolver.js
// schema
const typeDefs = `
type Query {
totalPhotos: Int!
}
`
// resolver
const resolvers = {
Query: {
totalPhotos: () => 42
}
Mutation: {
postPhoto(parent, args) {
photos.push(args)
return true
}
}
}
schemaのfieldに対応する関数を定義する
型が合っている必要がある
同じ名前である必要がある
Mutationのresolverの第1引数は親への参照
常に必要
このpostPhotoの場合、親はMutation
argsは(配列ではなく)recordになる
e.g. {name,description}
GraphQLを扱う中で一番ダルいところと思ってたけど、
ただのrepositoryのようなもので、
普通にrestを書く時よりはだいぶ手間減ってるか
restのときは、同じfieldに対しても、複数のrepoisitoryを書くことも合ったわけで
graphqlの場合は、1対1でしかない
まあでも1対1だからこそ数が増えてダルいということはありうるか
mutationの場合は、restのrespoitoryとほぼほぼ同じか
rootに追加されたresolverのこと
例
code:js
const resolvers = {
Query: { …… },
Mutation: { …… },
Photo: {
url: parent => http://yoursite.com/img/${parent.id}.jpg
}
}
これのPhotoの中のurlとかがtrivial resolver
GraphQL関係なく存在するEntityから、GraphQL Schemaを生成するために必要という感じ
その仲介、変換をやってくれるみたいな
Entityを修正したらResolverも修正するのか