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

Next.js v13动态页面数据获取失败,props传递异常求助

Next.js v13 动态页面getStaticProps/Paths数据传递报错问题

报错信息

./somepage/[id].js (20:25) @ map
Unhandled Runtime Error
TypeError: Cannot read properties of undefined (reading 'map')

问题现象

在Next.js v13项目中创建动态页面[id].js,尝试通过getStaticProps和getStaticPaths从helper文件获取数据时:

  • getStaticProps中的console.log(posts)无输出,页面组件接收的posts为undefined,触发map调用报错
  • 直接在页面组件中调用postData能正常获取数据,怀疑是Next.js版本导致props传递异常

相关代码

动态页面 ./somepage/[id].js

// "./somepage/[id].js"

import {postData} from "./lib/helper"


function classNames(...classes) {
  return classes.filter(Boolean).join(" ");
}

export default function Post({  posts }) {
 
  console.log(posts); //输出"undefined"
  console.log(postData) //成功打印数据
  return (
    <>
     {posts.map((post) =>{
       <div key = {post.id}>
        Hello {post.author}, This is your title: {post.title}
       </div>
      })}
    </>
  );
}

export async function getStaticPaths({ params }) {
  const { id } = params;
  const posts = postData(id);

  const paths = posts.map((item) => {
    params: {
      id: item.id.toString();
    }
    return {
      paths,
      fallback: false,
    };
  });
}

export async function getStaticProps() {
  const posts = postData();

  console.log(posts); //控制台无输出
  return {
    props: { posts }, //该props在页面中为undefined
  };
}

辅助文件 ./lib/helper.js

// "./lib/helper.js"

export function postData(id) {
const data = [{
// 省略数据内容
}]

if(id){
return data.filter((item) => {
   return item.id === id;
});
}

return data;

}

问题原因及修复方案

1. 路由模式适配问题

如果你的页面放在app/目录下(App Router),getStaticProps和getStaticPaths完全不生效——这两个方法是Pages Router(pages/目录)专属API。

  • 修复:要么把页面迁移到pages/目录;要么改用App Router的静态生成方案(用generateStaticParams替代getStaticPaths,直接在组件内调用数据方法或利用fetch的静态优化特性)。

2. getStaticPaths 代码逻辑错误

原代码存在语法和逻辑双重问题:

  • getStaticPaths不需要接收params参数,它的作用是预生成所有可能的动态路径,需先获取全量数据再生成路径
  • map内部对象语法错误,返回结构完全不符合要求
  • 正确写法:
export async function getStaticPaths() {
  // 获取全量数据生成所有可能的路径
  const allPosts = postData();
  const paths = allPosts.map((item) => ({
    params: {
      id: item.id.toString()
    }
  }));

  return {
    paths,
    fallback: false
  };
}

3. getStaticProps 未处理动态参数

动态页面需要根据当前路由的id过滤数据,原代码未接收params参数,导致无法返回对应数据(甚至因为路由模式错误根本没执行):

export async function getStaticProps({ params }) {
  // 根据当前路由id获取对应数据
  const posts = postData(params.id);
  console.log(posts);
  return {
    props: { posts }
  };
}

4. 页面组件map未返回元素

原map函数内的JSX没有return,同时要给posts设置默认值避免空值报错:

export default function Post({ posts = [] }) {
  console.log(posts);
  return (
    <>
     {posts.map((post) => (
       <div key={post.id}>
        Hello {post.author}, This is your title: {post.title}
       </div>
     ))}
    </>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:30:43