Capítulo 152 de 456
after agenda trabalho para executar depois que a resposta (ou o prerender) já terminou, sem bloquear o retorno ao usuário. Serve para logging, analytics e outros efeitos colaterais que não precisam atrasar a resposta.
after(callback): importado de next/server; roda o callback após a resposta (ou prerender) ser finalizada.after não torna a rota dinâmica; em página estática o callback roda no build ou na revalidação.generateMetadata), Server Functions, Route Handlers e Proxy.after roda pelo tempo máximo padrão/configurado da plataforma; ajustável via maxDuration no route segment config.waitUntil: primitiva usada internamente (via globalThis[Symbol.for('@next/request-context')]) para estender a vida da invocação serverless até as promises de after resolverem.import { after } from 'next/server'
import { log } from '@/app/utils'
export default function Layout({ children }: { children: React.ReactNode }) {
after(() => {
log()
})
return <>{children}</>
}
// Route Handler / Server Function: cookies/headers funcionam direto dentro do after
export async function POST(request: Request) {
after(async () => {
const userAgent = (await headers()).get('user-agent') || 'unknown'
const sessionCookie = (await cookies()).get('session-id')?.value || 'anonymous'
logUserAction({ sessionCookie, userAgent })
})
return new Response(JSON.stringify({ status: 'success' }), { status: 200 })
}
cookies/headers podem ser lidos dentro do callback do after.// Server Component: ler request data ANTES do after, nunca dentro
export default async function Page() {
const userAgent = (await headers()).get('user-agent') || 'unknown'
const sessionCookie = (await cookies()).get('session-id')?.value || 'anonymous'
after(() => {
logUserAction({ sessionCookie, userAgent })
})
return <h1>My Page</h1>
}
cookies()/headers() dentro do callback lança erro em runtime; leia antes e passe por closure.| Deployment Option | Suportado |
|---|---|
| Node.js server | Sim |
| Docker container | Sim |
| Static export | Não |
| Adapters | Depende da plataforma |
cookies()/headers() dentro do callback em Server Component: lança erro em runtime; leia os dados antes do after e passe por closure.after bloqueia notFound/redirect: after executa mesmo se a resposta terminar com erro, notFound() ou redirect().after não muda a natureza estática/dinâmica da rota, só adia efeitos colaterais.after devem estar isolados em um componente dinâmico envolto por <Suspense>.after pode ser aninhado dentro de outros after, útil para criar wrappers utilitários.cache para deduplicar funções chamadas dentro de múltiplos after.waitUntil manualmente para suportar after em ambiente serverless.after deve terminar.after depende do contexto de execução.after em rotas prerenderizadas.