Apollo Server setup in GraphQL - Time & Space Complexity
When setting up Apollo Server, it's important to understand how the server handles requests as the number of queries grows.
We want to know how the work the server does changes when more data or queries come in.
Analyze the time complexity of this Apollo Server setup code.
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql`
type Query {
books: [Book]
}
type Book {
title: String
author: String
}
`;
const books = [
{ title: 'Book 1', author: 'Author A' },
{ title: 'Book 2', author: 'Author B' }
];
const resolvers = {
Query: {
books: () => books
}
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen();
This code sets up a simple Apollo Server that returns a list of books when queried.
Look for parts that repeat work as input grows.
- Primary operation: Returning the list of books from the resolver.
- How many times: The resolver runs once per query request, and returns all books in the array.
As the number of books increases, the server returns more items each time.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Returns 10 books |
| 100 | Returns 100 books |
| 1000 | Returns 1000 books |
Pattern observation: The work grows directly with the number of books to return.
Time Complexity: O(n)
This means the time to respond grows linearly with the number of books requested.
[X] Wrong: "Apollo Server setup always runs in constant time regardless of data size."
[OK] Correct: The server work depends on how much data it sends back; more data means more work.
Understanding how server response time grows with data size helps you design efficient APIs and explain your choices clearly.
What if the resolver fetched books from a database with a filter? How would that affect the time complexity?
Practice
Apollo Server in a GraphQL application?Solution
Step 1: Understand Apollo Server's role
Apollo Server is designed to create and run GraphQL APIs, handling client requests and responses.Step 2: Differentiate from other roles
Styling UI, storing data, or managing authentication are separate concerns not handled by Apollo Server itself.Final Answer:
To create and run a GraphQL API server -> Option DQuick Check:
Apollo Server = GraphQL API server [OK]
- Confusing Apollo Server with frontend tools
- Thinking Apollo Server stores data
- Assuming Apollo Server only handles authentication
Solution
Step 1: Identify correct CommonJS import syntax
In Node.js using CommonJS, destructuring import is done withconst { ApolloServer } = require('apollo-server');.Step 2: Check other options
import { ApolloServer } from 'apollo-server'; is ES module syntax, const ApolloServer = require('apollo-server'); incorrectly assigns the entire module, import ApolloServer from 'apollo-server'; misses destructuring.Final Answer:
const { ApolloServer } = require('apollo-server'); -> Option CQuick Check:
CommonJS import with destructuring = const { ApolloServer } = require('apollo-server'); [OK]
- Using ES module import in CommonJS environment
- Not destructuring ApolloServer from the package
- Assigning require result directly without destructuring
{ hello }?
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql`type Query { hello: String }`;
const resolvers = { Query: { hello: () => 'Hi there!' } };
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => console.log(`Server ready at ${url}`));Solution
Step 1: Analyze typeDefs and resolvers
The schema defines a Query type with a 'hello' field returning String. The resolver returns 'Hi there!'.Step 2: Predict query response
Querying { hello } returns the resolver's string 'Hi there!' wrapped in data JSON.Final Answer:
{ "data": { "hello": "Hi there!" } } -> Option BQuick Check:
Query { hello } = 'Hi there!' response [OK]
- Assuming default 'Hello World' response
- Thinking missing resolver causes syntax error
- Confusing server start errors with query output
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql`type Query { greeting: String }`;
const resolvers = { Query: { greet: () => 'Hello!' } };
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => console.log(`Server ready at ${url}`));Solution
Step 1: Compare schema and resolver fields
The schema defines a Query field named 'greeting', but the resolver defines 'greet'. They must match exactly.Step 2: Understand impact of mismatch
This mismatch causes the 'greeting' field to have no resolver, resulting in null or error responses.Final Answer:
The resolver field name 'greet' does not match the schema field 'greeting' -> Option AQuick Check:
Schema and resolver field names must match [OK]
- Assuming resolver names can differ from schema
- Ignoring case sensitivity in field names
- Thinking server.listen() needs a callback argument
Solution
Step 1: Understand Apollo Server dataSources option
Apollo Server accepts adataSourcesfunction that returns objects to access external data, like databases.Step 2: Evaluate other options
Database queries do not belong intypeDefsorgqlstrings, andserver.listen()is for starting the server, not querying data.Final Answer:
Pass a dataSources function returning an object with your database API instance to ApolloServer constructor -> Option AQuick Check:
Use dataSources to connect databases in Apollo Server [OK]
- Putting queries inside schema definitions
- Trying to query database in server.listen callback
- Ignoring Apollo Server's dataSources feature
Ready to prove it?
Pass the test and this pattern moves unknown
