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

Next.js 13使用getServerSideProps时map读取未定义属性错误求助

Next.js 13中getServerSideProps获取数据时出现"Cannot read properties of undefined (reading 'map')"错误

问题背景

使用Next.js 13构建前端,需通过服务端渲染(SSR)从指定链接获取JSON数据填充网站。使用getStaticProps时功能正常,但切换为getServerSideProps后持续触发上述错误。由于网站需应对数据库动态变更,无法使用静态站点生成(SSG)。

项目目录结构

项目目录结构

当前代码

服务端渲染代码

export async function getServerSideProps(){
  const res = await fetch("https://www.jsonkeeper.com/b/4G1G");
  const data = await res.json();

  return {
    props: {
      todos: data
    }
  }
}

页面组件代码

export default function Home({ todos }) {
  return (
    // {styles.container}
    <div className="bg-white">
     <Head>
        <title>PAPA AIRBNB</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
    </Head>

    {todos?.length === 0 ? (
      <div>
        loading...
      </div>
    ) : (
      todos.map((todos) => (
        <div key={todos.id}>
          <p>
            {todos.id}: {todos.title}
          </p>
        </div>
      ))
    )}
    </div>
  )
}

问题分析

你请求的JSON接口返回的是包含todos数组的对象(结构为{"todos": [...]}),但在getServerSideProps中直接将整个响应对象赋值给了todos props,导致组件中拿到的todos是对象而非数组。对象没有map方法,且todos?.length判断会因对象无length属性进入else分支,最终触发报错。

解决方案

1. 修正数据获取逻辑

在getServerSideProps中正确提取todos数组,并添加错误处理避免请求失败时出现异常:

export async function getServerSideProps(){
  try {
    const res = await fetch("https://www.jsonkeeper.com/b/4G1G");
    // 校验请求是否成功
    if (!res.ok) throw new Error('数据请求失败');
    const data = await res.json();

    return {
      props: {
        todos: data.todos || [] // 确保即使接口返回的todos不存在,也返回空数组
      }
    }
  } catch (error) {
    console.error('获取数据出错:', error);
    // 出错时返回空数组,避免组件崩溃
    return {
      props: {
        todos: []
      }
    }
  }
}

2. 优化组件内数据校验

在组件中确保todos是数组,避免因异常数据导致报错,同时修正循环变量名(避免与数组重名):

import Head from 'next/head'; // 补充Head的导入

export default function Home({ todos }) {
  // 确保todos始终是数组
  const validTodos = Array.isArray(todos) ? todos : [];

  return (
    <div className="bg-white">
     <Head>
        <title>PAPA AIRBNB</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
    </Head>

    {validTodos.length === 0 ? (
      <div>loading...</div>
    ) : (
      validTodos.map((todo) => (
        <div key={todo.id}>
          <p>
            {todo.id}: {todo.title}
          </p>
        </div>
      ))
    )}
    </div>
  )
}

相关方法说明

  • getStaticProps:告知Next.js组件在构建阶段填充props并生成静态HTML的方法。
  • getServerSideProps:告知Next.js组件在每次请求时运行并填充props、生成HTML的服务端渲染方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:50:27