📖 Scenario: You are building a GraphQL API for a blog platform. The blog has many posts, and you want to show posts to users in small chunks (pages) instead of all at once. This helps the app load faster and makes it easier for users to browse posts.
🎯 Goal: Create a GraphQL query that implements cursor-based pagination to fetch blog posts in pages. You will set up the data structure, add a pagination configuration, write the main query logic using cursors, and complete the pagination response structure.
📋 What You'll Learn
Create a list of posts with exact titles and IDs
Add a variable for the page size limit
Write a GraphQL query that fetches posts after a given cursor
Complete the pagination response with edges, nodes, and pageInfo
💡 Why This Matters
🌍 Real World
Cursor-based pagination is used in many apps to efficiently load data in chunks, improving user experience and reducing server load.
💼 Career
Understanding cursor-based pagination is important for backend developers working with APIs, especially GraphQL, to build scalable and performant data fetching.
Progress0 / 4 steps
1
Create the posts data list
Create a list called posts with these exact entries: { id: "1", title: "GraphQL Basics" }, { id: "2", title: "Advanced GraphQL" }, { id: "3", title: "GraphQL Pagination" }, { id: "4", title: "GraphQL Subscriptions" }, { id: "5", title: "GraphQL Security" }.
GraphQL
Hint
Use a list of objects with id and title keys exactly as shown.
2
Add the page size limit variable
Add a variable called pageSize and set it to 2 to limit the number of posts returned per page.
GraphQL
Hint
Set pageSize to 2 to fetch two posts per page.
3
Write the GraphQL query with cursor logic
Write a GraphQL query called getPosts that takes an optional after cursor argument of type ID. Use posts and pageSize to return posts after the cursor, limited by pageSize. Use edges with cursor and node fields.
GraphQL
Hint
Use edges with cursor and node fields inside the query.
4
Complete the pagination response with pageInfo
Add the pageInfo field inside the posts query response. Include hasNextPage and endCursor fields to complete the cursor-based pagination structure.
GraphQL
Hint
Include pageInfo with hasNextPage and endCursor inside the posts field.
Practice
(1/5)
1. What is the main purpose of cursor-based pagination in GraphQL?
easy
A. To fetch all data at once without limits
B. To sort data alphabetically
C. To fetch data in small parts using a cursor to mark position
D. To delete data from the database
Solution
Step 1: Understand pagination purpose
Pagination is used to split large data into smaller parts for easier handling.
Step 2: Identify cursor role
Cursor marks the position in the data to fetch the next part without overlap or missing items.
Final Answer:
To fetch data in small parts using a cursor to mark position -> Option C
Quick Check:
Cursor-based pagination = fetch data in parts [OK]
Hint: Cursor marks position to fetch next data chunk [OK]
Common Mistakes:
Thinking pagination fetches all data at once
Confusing cursor with sorting
Assuming pagination deletes data
2. Which of the following is the correct way to request the first 5 items after a cursor in GraphQL?
Hint: Use first and after arguments for cursor pagination [OK]
Common Mistakes:
Using limit instead of first
Using startAfter or afterCursor which are invalid
Confusing argument names
3. Given this GraphQL query: { users(first: 3, after: "YXJyYXljb25uZWN0aW9uOjE=") { edges { node { id name } } pageInfo { hasNextPage endCursor } } } What does the endCursor represent in the result?
medium
A. The cursor of the last item in the current page
B. The total number of items in the database
C. The cursor of the first item in the current page
D. The number of pages available
Solution
Step 1: Understand pageInfo fields
endCursor marks the cursor of the last item returned in the current page.
Step 2: Differentiate from other fields
hasNextPage shows if more pages exist; endCursor is not a count or first item cursor.
Final Answer:
The cursor of the last item in the current page -> Option A
Quick Check:
endCursor = last item cursor [OK]
Hint: endCursor points to last item fetched [OK]
Common Mistakes:
Confusing endCursor with total count
Thinking endCursor is first item cursor
Assuming endCursor is page count
4. You wrote this GraphQL query for cursor pagination: { posts(first: 10, afterCursor: "abc123") { edges { node { title } } } } Why does this query fail?
medium
A. The argument should be named after, not afterCursor
B. The first argument must be a string, not a number
C. The edges field is invalid in cursor pagination
D. The cursor value cannot be a string
Solution
Step 1: Check argument names for cursor pagination
The correct argument to specify the cursor is after, not afterCursor.
Step 2: Validate other parts
first accepts a number; edges is valid; cursor values are strings.
Final Answer:
The argument should be named after, not afterCursor -> Option A
Quick Check:
Use 'after' argument name [OK]
Hint: Use 'after' not 'afterCursor' for cursor argument [OK]
Common Mistakes:
Using incorrect argument names
Thinking first must be string
Misunderstanding edges field usage
5. You want to fetch all comments in batches of 4 using cursor-based pagination. The first query is: { comments(first: 4) { edges { node { id text } } pageInfo { hasNextPage endCursor } } } To fetch the next batch, which query should you use?
hard
A. { comments(limit: 4, after: "endCursor_value") { edges { node { id text } } } }
B. { comments(first: 4, after: "endCursor_value") { edges { node { id text } } pageInfo { hasNextPage endCursor } } }
C. { comments(last: 4, after: "endCursor_value") { edges { node { id text } } } }
D. { comments(first: 4, before: "endCursor_value") { edges { node { id text } } } }
Solution
Step 1: Understand how to continue pagination
Use the after argument with the endCursor value from the previous page to fetch the next batch.
Step 2: Check argument correctness
first: 4 limits to 4 items; after moves cursor forward; before or last are for backward pagination.
Final Answer:
{ comments(first: 4, after: "endCursor_value") { edges { node { id text } } pageInfo { hasNextPage endCursor } } } -> Option B
Quick Check:
Use first and after with endCursor for next batch [OK]
Hint: Use first and after with endCursor to paginate forward [OK]
Common Mistakes:
Using before instead of after for next page
Using last instead of first for forward pagination
Using limit instead of first argument
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.