GraphQL Best Practices
GraphQL optimization and patterns
Pagination
type Query {
users(first: Int, after: String): UserConnection!
}
type UserConnection {
edges: [UserEdge!]!
pageInfo: PageInfo!
} # cursor-based pagination
Error Handling
type UserResponse {
success: Boolean!
message: String
user: User
errors: [Error!]
} # structured error response
Input Types
input CreateUserInput {
name: String!
email: String!
age: Int
}
type Mutation {
createUser(input: CreateUserInput!): User!
} # group related arguments
DataLoader
const userLoader = new DataLoader(async (ids) => {
const users = await getUsersByIds(ids);
return ids.map(id => users.find(u => u.id === id));
}); # batch and cache requests
Depth Limiting
const depthLimit = require('graphql-depth-limit');
validationRules: [depthLimit(5)] # limit query depth
Query Complexity
# Assign complexity scores to fields
# Reject queries exceeding threshold
# Prevents expensive queries