Next.js
Beginner
1 min read
Context, Hooks, and Sharing Data Across the Server
Example
// lib/auth.ts — cached auth check shared across Server Components
import { cache } from 'react';
import { cookies } from 'next/headers';
import { verifySession } from '@/lib/session';
// cache() ensures this runs at most once per request
// even if called from multiple Server Components
export const getUser = cache(async () => {
const cookieStore = cookies();
const sessionToken = cookieStore.get('session')?.value;
if (!sessionToken) return null;
const session = await verifySession(sessionToken);
return session?.user ?? null;
});
// app/dashboard/page.tsx
import { getUser } from '@/lib/auth';
import { redirect } from 'next/navigation';
export default async function DashboardPage() {
const user = await getUser(); // cached — no duplicate DB query
if (!user) redirect('/login');
return <h1>Welcome, {user.name}</h1>;
}
// app/dashboard/layout.tsx
import { getUser } from '@/lib/auth';
export default async function DashboardLayout({
children,
}: {
children: React.ReactNode;
}) {
const user = await getUser(); // same cached call — no extra query
return (
<div>
<nav>Logged in as {user?.email}</nav>
{children}
</div>
);
}