Subscription resolvers let your app listen for real-time updates from the server. They send new data automatically when something changes.
Subscription resolvers in GraphQL
Introduction
Syntax
GraphQL
subscription SubscriptionName {
eventName {
field1
field2
}
}Subscription resolvers use the subscription keyword instead of query or mutation.
They return a stream of data, not just one response.
Examples
GraphQL
subscription NewMessage {
messageAdded {
id
content
sender
}
}GraphQL
subscription StockPriceUpdate {
stockPriceChanged {
symbol
price
}
}Sample Program
This subscription listens for new notifications and returns their id, message, and creation time as they arrive.
GraphQL
subscription NewNotification {
notificationReceived {
id
message
createdAt
}
}Important Notes
Subscriptions require a WebSocket or similar connection to keep the data flowing.
They are great for live updates but can use more resources than queries.
Make sure your server supports subscriptions and you handle connection setup in your client.
Summary
Subscription resolvers let your app get live updates automatically.
Use them when you want real-time data like chat, notifications, or live scores.
They use the subscription keyword and keep sending data as events happen.
Practice
1. What is the main purpose of a
subscription resolver in GraphQL?easy
Solution
Step 1: Understand the role of subscription resolvers
Subscription resolvers are designed to send data updates automatically as events happen, unlike queries which fetch data once.Step 2: Compare with other resolver types
Queries fetch data once, mutations modify data, and schema defines types. Only subscriptions provide live updates.Final Answer:
To provide real-time updates to clients when data changes -> Option CQuick Check:
Subscription = real-time updates [OK]
Hint: Subscriptions push live data updates automatically [OK]
Common Mistakes:
- Confusing subscriptions with queries
- Thinking subscriptions modify data
- Mixing schema definition with resolver purpose
2. Which of the following is the correct way to declare a subscription resolver in GraphQL SDL?
easy
Solution
Step 1: Identify the correct GraphQL operation keyword
Subscriptions use thetype Subscriptionkeyword to declare real-time data streams in the schema.Step 2: Check other operation keywords
Queries usetype Query, mutations usetype Mutation, andtype Resolveris not a valid keyword.Final Answer:
type Subscription { newMessage: Message } -> Option AQuick Check:
Subscription keyword = subscription declaration [OK]
Hint: Use 'type Subscription' keyword to declare live data streams [OK]
Common Mistakes:
- Using 'type Query' or 'type Mutation' instead of 'type Subscription'
- Trying to use 'type Resolver' keyword
- Misplacing subscription declaration outside schema
3. Given this subscription resolver code snippet, what will be the output when a new message is published?
const resolvers = {
Subscription: {
newMessage: {
subscribe: () => pubsub.asyncIterator(['MESSAGE_ADDED'])
}
}
};medium
Solution
Step 1: Understand the subscribe function
Thesubscribefunction returns an async iterator for the event 'MESSAGE_ADDED', so it listens for new messages.Step 2: Determine what triggers updates
Updates are sent only when the 'MESSAGE_ADDED' event occurs, so clients get notified only on new messages.Final Answer:
The client receives updates only when a message is added -> Option AQuick Check:
Subscription triggers on event = client updates [OK]
Hint: Subscribe returns async iterator for live event updates [OK]
Common Mistakes:
- Assuming all past data is sent immediately
- Thinking updates require queries first
- Missing that subscribe returns async iterator
4. Identify the error in this subscription resolver code:
const resolvers = {
Subscription: {
newNotification: {
subscribe: pubsub.asyncIterator('NOTIFICATION_ADDED')
}
}
};medium
Solution
Step 1: Check the subscribe property type
Thesubscribeproperty must be a function that returns the async iterator, not the async iterator itself.Step 2: Verify correct usage of asyncIterator
It should besubscribe: () => pubsub.asyncIterator('NOTIFICATION_ADDED')to work properly.Final Answer:
The subscribe function should be a function returning asyncIterator, not the asyncIterator itself -> Option DQuick Check:
Subscribe must be a function returning asyncIterator [OK]
Hint: Subscribe must be a function returning asyncIterator [OK]
Common Mistakes:
- Assigning asyncIterator directly instead of a function
- Using string instead of array for event names (optional)
- Confusing subscription with query resolvers
5. You want to create a subscription that only sends updates to clients when a new comment is added to a specific post ID. Which resolver implementation correctly filters events by post ID?
const resolvers = {
Subscription: {
commentAdded: {
subscribe: (parent, args, { pubsub }) => {
return pubsub.asyncIterator('COMMENT_ADDED');
},
resolve: (payload, args) => {
if (payload.postId === args.postId) {
return payload;
}
return null;
}
}
}
};hard
Solution
Step 1: Understand event filtering in subscriptions
Theresolvefunction can filter events by checking if the payload matches the subscription arguments.Step 2: Check the given code logic
The code returns the payload only ifpayload.postId === args.postId, otherwise returns null to skip irrelevant events.Final Answer:
This implementation correctly filters comments by postId in the resolve function -> Option BQuick Check:
Filtering in resolve function = correct approach [OK]
Hint: Filter events in resolve by comparing payload and args [OK]
Common Mistakes:
- Trying to filter inside subscribe instead of resolve
- Expecting asyncIterator to filter by arguments automatically
- Believing subscriptions cannot filter events
Recommended
Ready to prove it?
Pass the test and this pattern moves unknown
10 questions ~5 mineasy hard
