← Blog

Next.js Metadata uppdateras inte? Här är varför

Du uppdaterar generateMetadata, distribuerar om, och den gamla titeln eller bilden visas fortfarande när du delar länken. Så här avgör du om det är ett cachinglager eller ett kodfel.

Osäker på om det är din kod eller en cache?

Kolla det gratis med Proovd. Den visar exakt vilken metadata din live-URL visar just nu, oberoende av vilken plattforms egen cache som helst.

Snabbt svar

  • De flesta fall är Next.jss egen datacache eller en CDN-cache som serverar inaktuell HTML, inte en kodbugg
  • generateMetadata i en serverkomponent körs bara om när dess underliggande hämtningscache förnyas
  • Resten är vanligtvis plattformens cache (Facebook, LinkedIn, etc.), inte Next.js. Kontrollera båda innan du utgår från antingen

Reproducerbart exempel

Detta ser korrekt ut men kommer att fortsätta visa inaktuell metadata efter en innehållsändring:

export async function generateMetadata({ params }) {
  const post = await fetch(`https://api.example.com/posts/${params.slug}`).then(r => r.json());

  return {
    title: post.title,
    openGraph: {
      images: [post.image],
    },
  };
}

Anropet fetch här cachelagras av Next.jss datacache som standard. Om post.title eller post.image ändras i din CMS, kommer den här funktionen inte att se det nya värdet förrän cachen valideras. Utan någon explicit strategi kan det betyda inte förrän nästa fullbyggda.

Varför din metadata inte uppdateras

Den underliggande hämtningen cachelagras

Som standard cachelagras fetch() inuti generateMetadata på obestämd tid i approutern. Åtgärda genom att ställa in ett explicit förlängningsfönster:

const post = await fetch(url, { next: { revalidate: 60 } }).then(r => r.json());

Eller välj bort cachelagring helt för den begäran:

const post = await fetch(url, { cache: "no-store" }).then(r => r.json());

Rutten genereras statiskt

Om rutten använder generateStaticParams utan omvalidering konfigurerad, bakas hela rutten, inklusive metadata, in vid byggtiden. Att lägga till export const revalidate = 3600; på sidnivå tvingar fram periodisk regenerering.

En CDN eller edge-cache serverar den gamla HTML-koden

Även om din konstruktion är korrekt, kan Vercels Edge Network, Cloudflare eller en annan CDN framför din app visa ett cachat HTML-svar som föregår din fix. Kontrollera svarsrubriker:

curl -I https://yoursite.com/blog/post-slug

Leta efter x-vercel-cache: HIT eller en liknande CDN header. En HIT betyder att du tittar på en cachad kopia, inte din senaste distribution.

opengraph-image.ts plockar inte upp ny data

Om du använder den filbaserade opengraph-image.ts-konventionen, genererar Next.js en statisk bild vid byggtid som standard. Dynamiskt innehåll inuti det är föremål för samma cachningsregler som alla andra serverkomponenter, så lägg till explicit förlängning om det behöver hålla sig uppdaterat.

Det är faktiskt plattformens cache, inte din

Det vanligaste falsklarmet. Din app kan visa helt färsk metadata medan Facebook, LinkedIn eller Slack fortfarande visar en förhandsvisning som de cachade för flera dagar sedan. Bekräfta vad din server skickar innan du trycker på någon Next.js-kod. Se vår guide för att rensa OG-cache på varje plattform.

Steg-för-steg-fixguide

  1. Kör curl -s https://yoursite.com/page | grep -i "og:" för att se vad din server faktiskt skickar
  2. Sök efter en CDN cache HIT rubrik med curl -I https://yoursite.com/page
  3. Lägg till explicit revalidate eller cache: "no-store" för hämtningar inuti generateMetadata
  4. Tvinga en ny implementering för att utesluta en inaktuell byggcache
  5. Verifiera liveresultatet med Proovd

Next.js kontra andra ramverk

Framework Common cause Fix pattern
Next.js (App Router) Cached fetch inside generateMetadata, or static build with no ISR revalidate option or cache: "no-store"
Astro Client-only meta tag injection instead of static frontmatter/SSR Move tags into the page's static output
SvelteKit Meta tags set only client-side, not in the server load function Load meta values server-side, pass to the head

Quick Fix Checklista

  1. Bekräftat rå HTML-utdata har rätt taggar (inte bara webbläsarens DOM)
  2. Lagt till explicit revalidate eller cache: "no-store" för att hämta inuti generateMetadata
  3. Kontrollerade CDN/edge cache-rubriker för en inaktuell HIT
  4. Bekräftat om rutten är helt statisk utan ISR
  5. Utesluter den sociala plattformens egen cache som den verkliga orsaken
  6. Verifierade den slutliga liveutgången med Proovd

Vanliga frågor

Varför uppdateras min og:image i webbläsaren men inte på Facebook eller LinkedIn?

Din Next.js-app visar sannolikt redan rätt tagg. Plattformen visar en kopia som den cachade innan din fix. Använd den plattformens eget verktyg för att uppdatera cache i stället för att ändra mer kod.

Inaktiverar revalidate: 0 cachning helt?

Inställningen revalidate: 0 tvingar effektivt fram dynamisk rendering för den hämtningen på varje begäran, liknande cache: "no-store". Använd det sparsamt eftersom det tar bort prestandafördelarna med cachelagring.

Bekräfta vad din Next.js-app faktiskt serverar

Kontrollera din livemetadata gratis med Proovd. Den visar exakt vad som finns i din HTML just nu, oberoende av någon plattforms cache.