Queries, mutations, subscriptions, resolvers, and schema design.
query { field }query { user(id: "1") { name email posts { title } } }query Name($var: Type!)query GetUser($id: ID!) { user(id: $id) { name } }aliases{ adult: users(age: 18) { name } child: users(age: 5) { name } }fragment on Typefragment UserFields on User { id name email }@include(if: $bool){ user { name email @include(if: $showEmail) } }__typename{ search { __typename ... on Post { title } ... on User { name } } }mutation { action(input) }mutation { createPost(title: "Hi") { id title } }input typeinput CreatePostInput { title: String! body: String }Optimistic UI patternoptimisticResponse: { createPost: { id: 'temp', __typename: 'Post' } }Returning affected fieldsmutation { updateUser(id:1, name:"A") { id name updatedAt } }Error payload patterntype MutationResult { success: Boolean! errors: [Error!] }File uploads (multipart)mutation($file: Upload!) { uploadAvatar(file: $file) { url } }subscription { event }subscription { messageAdded(chatId: "1") { id body author { name } } }PubSub enginepubsub.publish('MESSAGE_ADDED', { messageAdded: newMsg })withFilter()withFilter(asyncIter, (payload, vars) => payload.roomId === vars.roomId)@defer / @stream{ user { name ... @defer { longComputedField } } }type / scalar / enumenum Role { ADMIN EDITOR MEMBER }interface / unionunion SearchResult = Post | User | TagRelay Cursor Connections{ posts(first: 10, after: "cursor") { edges { node { title } } pageInfo { hasNextPage } } }Custom Directivesdirective @auth(role: Role) on FIELD_DEFINITIONSchema Stitching / Federation@key(fields: "id") type User @extends { id: ID! @external }DataLoader (N+1 fix)const loader = new DataLoader(ids => User.findByIds(ids))resolver(parent, args, ctx, info)user: (_, { id }, { db }) => db.users.findById(id)Context object (ctx)context: ({ req }) => ({ user: getUser(req.headers.authorization) })Query depth limitingdepthLimit(7) // graphql-depth-limit packageQuery complexity scoringcreateComplexityRule({ maximumComplexity: 1000 })Persisted QueriesGET /graphql?extensions={"persistedQuery":{"sha256Hash":"abc"}}Disable Introspection (prod)introspection: process.env.NODE_ENV !== 'production'