You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js静态导出报错:generateStaticParams缺失/blog/testpost参数

问题:Next.js静态导出博客时generateStaticParams报错原因

我参考Next.js官方博客启动示例搭建个人博客时,出现如下报错:

Error: Page "/blog/[slug]/page" is missing param "/blog/testpost" in "generateStaticParams()", which is required with "output: export" config.

其中testpost是我posts文件夹下的一个Markdown文件名,以下是相关代码,请分析报错原因。


相关代码

lib/api.ts

import fs from 'fs';
import matter from 'gray-matter';
import { join } from 'path';

const postsDirectory = join(process.cwd(), 'posts');

export function getPostSlugs() {
  return fs.readdirSync(postsDirectory);
}

type Post = {
  slug: string;
  title: string;
  date: string;
  content: string;
  coverImage: string;
  description: string;
};

export function getPostBySlug(slug: string) {
  const realSlug = slug.replace(/\.md$/, '');
  const fullPath = join(postsDirectory, `${realSlug}.md`);
  const fileContents = fs.readFileSync(fullPath, 'utf8');
  const { data, content } = matter(fileContents);
  return { ...data, slug: realSlug, content } as Post;
}

export function getAllPosts(): Post[] {
  const slugs = getPostSlugs();
  const posts = slugs
    .map((slug) => getPostBySlug(slug))
    .sort((post1, post2) => (post1.date > post2.date ? -1 : 1));
  return posts;
}

/blog/[slug]/page.tsx

import { getAllPosts, getPostBySlug } from '@/app/lib/api';
import { notFound } from 'next/navigation';
import markdownToHtml from '@/app/lib/markdowntoHtml';
import Link from 'next/link';
import { Metadata } from 'next';

type Params = {
  params: {
    slug: string;
  };
};

export default async function Page({ params }: Params) {
  const post = getPostBySlug(params.slug);
  if (!post) {
    return notFound();
  }

  const content = await markdownToHtml(post.content || '');

  return (
    <main>
      <article>
        <h1>{post.title}</h1>
      </article>
    </main>
  );
}

export async function generateStaticParams() {
  const posts = getAllPosts();

  return posts.map((post) => {
    slug: post.slug;
  });
}

报错原因分析

问题出在generateStaticParams函数的map回调写法上:

  • 你在回调里试图返回{ slug: post.slug }对象,但没有用圆括号包裹,导致这段代码被解析为代码块而非对象字面量。此时回调函数默认返回undefined,最终generateStaticParams返回的是一个全为undefined的数组,Next.js无法获取到正确的slug参数,因此报错说缺少testpost这个参数。

修复方法

给对象字面量加上圆括号,让解析器识别为返回对象:

export async function generateStaticParams() {
  const posts = getAllPosts();

  return posts.map((post) => ({
    slug: post.slug
  }));
}

或者显式添加return语句:

export async function generateStaticParams() {
  const posts = getAllPosts();

  return posts.map((post) => {
    return { slug: post.slug };
  });
}

修改后,generateStaticParams就能正确返回包含所有slug的参数数组,Next.js在静态导出时会为每个post生成对应的静态页面。

内容的提问来源于stack exchange,提问作者matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:52:43