📖 Scenario: You are building a blog website using Next.js. Each blog post page should have its own unique title and description that changes based on the post content.
🎯 Goal: Create a dynamic generateMetadata function in a Next.js page that sets the page title and description based on the blog post data.
📋 What You'll Learn
Create a simple blog post data object with title and description fields
Add a config variable for the site name
Write a generateMetadata function that returns metadata using the blog post data and site name
Export the generateMetadata function from the page file
💡 Why This Matters
🌍 Real World
Dynamic metadata improves SEO and user experience by showing relevant titles and descriptions for each page.
💼 Career
Understanding Next.js dynamic metadata is important for frontend developers working on modern React frameworks and SEO optimization.
Progress0 / 4 steps
1
Create blog post data
Create a constant called post with these exact properties: title set to "Learn Next.js Metadata" and description set to "A beginner guide to dynamic metadata in Next.js".
NextJS
Hint
Use const post = { title: "Learn Next.js Metadata", description: "A beginner guide to dynamic metadata in Next.js" }
2
Add site name configuration
Add a constant called siteName and set it to the string "My Blog Site".
NextJS
Hint
Use const siteName = "My Blog Site";
3
Write generateMetadata function
Write an exported async function called generateMetadata that returns an object with title set to `${post.title} | ${siteName}` and description set to post.description.
NextJS
Hint
Use export async function generateMetadata() { return { title: `${post.title} | ${siteName}`, description: post.description } }
4
Export generateMetadata from page
Ensure the generateMetadata function is exported from the page file so Next.js can use it for dynamic metadata.
NextJS
Hint
Export a default React component function called Page to complete the page file.
Practice
(1/5)
1. What is the main purpose of the generateMetadata function in Next.js?
easy
A. To fetch data on the client after page load
B. To handle client-side routing between pages
C. To create dynamic page titles and descriptions before rendering
D. To style components dynamically using CSS
Solution
Step 1: Understand the role of generateMetadata
This function runs on the server before the page renders to set metadata dynamically.
Step 2: Identify its main use
It is used to create dynamic page titles and descriptions for SEO and relevant info.
Final Answer:
To create dynamic page titles and descriptions before rendering -> Option C
Quick Check:
Dynamic metadata = To create dynamic page titles and descriptions before rendering [OK]
Hint: Remember: generateMetadata sets SEO info before page loads [OK]
Common Mistakes:
Confusing generateMetadata with client-side data fetching
Thinking it handles routing or styling
Assuming it runs on the client
2. Which of the following is the correct syntax to export a generateMetadata function in a Next.js page?
C. The return value must be a string, not an object
D. The console.log runs after return and is unreachable
Solution
Step 1: Analyze function flow
The return statement ends the function immediately, so code after it won't run.
Step 2: Identify unreachable code
The console.log after return is unreachable and will never execute.
Final Answer:
The console.log runs after return and is unreachable -> Option D
Quick Check:
Code after return is unreachable = The console.log runs after return and is unreachable [OK]
Hint: Code after return is ignored, place logs before return [OK]
Common Mistakes:
Thinking function must be async always
Expecting return to accept strings only
Confusing export types
5. You want to create dynamic metadata for a blog post page that shows the post title and author. Which generateMetadata implementation correctly handles this using params and fetch to get post data asynchronously?
hard
A. export async function generateMetadata({ params }) {
const post = await fetch(`/api/posts/${params.id}`).then(res => res.json());
return { title: post.title, description: `By ${post.author}` };
}
B. export function generateMetadata({ params }) {
const post = fetch(`/api/posts/${params.id}`).then(res => res.json());
return { title: post.title, description: `By ${post.author}` };
}
C. export async function generateMetadata() {
const post = await fetch('/api/posts').then(res => res.json());
return { title: post.title, description: post.author };
}
D. export async function generateMetadata({ params }) {
return { title: params.title, description: params.author };
}
Solution
Step 1: Identify async data fetching
To get post data dynamically, generateMetadata must be async and await the fetch call.
Step 2: Check usage of params and fetch
export async function generateMetadata({ params }) {
const post = await fetch(`/api/posts/${params.id}`).then(res => res.json());
return { title: post.title, description: `By ${post.author}` };
} correctly awaits fetch with params.id and returns metadata using fetched data.
Final Answer:
export async function generateMetadata({ params }) {
const post = await fetch(`/api/posts/${params.id}`).then(res => res.json());
return { title: post.title, description: `By ${post.author}` };
} -> Option A
Quick Check:
Async fetch with params used correctly = export async function generateMetadata({ params }) {
const post = await fetch(`/api/posts/${params.id}`).then(res => res.json());
return { title: post.title, description: `By ${post.author}` };
} [OK]
Hint: Use async/await with params to fetch dynamic metadata [OK]
Common Mistakes:
Not awaiting fetch causing unresolved promises
Ignoring params and fetching all posts
Returning params directly without fetching data
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.