TypeScript
Public
Dynamic Metadata with generateMetadata
Generate page-specific SEO metadata from a dynamic App Router route.
#nextjs
#seo
#meta
#typescript
TypeScript
// app/blog/[slug]/page.tsx
import type { Metadata } from 'next';
type PageProps = {
params: Promise<{
slug: string;
}>;
};
async function getPost(slug: string) {
return db.post.findUnique({
where: { slug },
select: {
title: true,
excerpt: true,
},
});
}
export async function generateMetadata({
params,
}: PageProps): Promise<Metadata> {
const { slug } = await params;
const post = await getPost(slug);
if (!post) {
return {
title: 'Post not found',
};
}
return {
title: post.title,
description: post.excerpt,
alternates: {
canonical: `/blog/${slug}`,
},
openGraph: {
title: post.title,
description: post.excerpt,
type: 'article',
},
};
}