Capítulo 302 de 456
Draft Mode faz Next.js pular Static Generation pra páginas específicas e renderizar em request time com conteúdo de rascunho (draft) de um headless CMS, em vez do conteúdo publicado.
res.setDraftMode({ enable: true }): chamado numa API Route, seta cookie __prerender_bypass que ativa Draft Mode nas requests seguintes.context.draftMode: dentro de getStaticProps, fica true quando o cookie está presente, permitindo buscar dado de rascunho em vez do publicado.slug na query string, validado na API route antes de habilitar o modo e redirecionar (307) evitando open redirect.res.setDraftMode({ enable: false }): limpa o cookie manualmente; se disparado via next/link, precisa prefetch={false} pra não apagar o cookie sem querer.getServerSideProps e API Routes: context.draftMode e req.draftMode respectivamente.next build, impedindo que seja adivinhado.export default async (req, res) => {
if (req.query.secret !== 'MY_SECRET_TOKEN' || !req.query.slug) {
return res.status(401).json({ message: 'Invalid token' })
}
const post = await getPostBySlug(req.query.slug)
if (!post) {
return res.status(401).json({ message: 'Invalid slug' })
}
res.setDraftMode({ enable: true })
res.redirect(post.slug)
}
req.query.slug cru no redirect).export async function getStaticProps(context) {
const url = context.draftMode
? 'https://draft.example.com'
: 'https://production.example.com'
const res = await fetch(url)
}
context.draftMode.req.query.slug: abre vulnerabilidade de open redirect; sempre redirecionar pro slug retornado pelo CMS após validação.Cache-Control em rota com Draft Mode: o cache não pode ser bypassed nesse caso; usar ISR em vez disso.next/link sem prefetch={false}: o prefetch dispara a rota de disable acidentalmente.context.draftMode funciona tanto em getStaticProps quanto em getServerSideProps; API Routes usam req.draftMode.