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

Next.js请求API数据报Cannot read property 'map' of undefined错

报错原因

getStaticProps是Next.js框架专属的服务端数据获取API,仅支持在pages目录下的路由页面组件中使用,你当前把该方法写在components/Blog.jsx这个公共组件文件内,Next.js构建/运行时根本不会执行这个方法,组件接收到的people入参默认是undefined,对undefined直接调用.map()方法就会触发你看到的报错。
另外原代码还有两个潜在问题:

  • 没有给people设置默认兜底值,一旦接口返回异常、网络报错,还是会触发同类错误
  • 循环渲染列表项没有加唯一key属性,会触发React渲染警告,极端情况会导致渲染错乱
修复方案

你可以根据自己的业务场景选下面两种方案之一:

方案1:保留静态生成(推荐,性能更好)

把数据获取逻辑移到对应的路由页面文件中,拿到数据后再通过props传给公共组件:

  1. 先修改路由页面(比如你要在/blog路径展示该内容,就创建/修改pages/blog.js):
// pages/blog.js
import Blog from '../components/Blog.jsx'

// getStaticProps 必须写在page页面文件内才会生效
export const getStaticProps = async () => {
  const response = await fetch('https://jsonplaceholder.typicode.com/users');
  const people = await response.json();

  return {
    props: {
      // 提前校验返回值,兜底空数组
      people: Array.isArray(people) ? people : []
    }
  };
};

export default function BlogPage({ people }) {
  return <Blog people={people} />
}
  1. 修改公共组件components/Blog.jsx,移除无效的getStaticProps,增加props兜底,补充列表key:
// components/Blog.jsx
export default function Blog({ people = [] }) {
  return (
    <div>
      {people.map(person => (
        // 用接口返回的唯一id作为key
        <div key={person.id}>
          <h1>{person.name}</h1>
          <h2>Website: {person.website}</h2>
          Email: <code>{person.email}</code>
        </div>
      ))}
    </div>
  );
};

方案2:组件内客户端取数

如果这个组件需要在多个页面复用、不方便在每个页面写取数逻辑,可以在组件内用React的useEffect在客户端侧拉取数据:

// components/Blog.jsx
import { useState, useEffect } from 'react'

export default function Blog() {
  // 初始化people为空数组,从根源避免undefined问题
  const [people, setPeople] = useState([])
  const [loading, setLoading] = useState(false)

  useEffect(() => {
    const fetchUsers = async () => {
      setLoading(true)
      try {
        const res = await fetch('https://jsonplaceholder.typicode.com/users')
        const data = await res.json()
        setPeople(Array.isArray(data) ? data : [])
      } catch (err) {
        console.error('数据拉取失败:', err)
        setPeople([])
      } finally {
        setLoading(false)
      }
    }
    fetchUsers()
  }, [])

  if (loading) return <div>数据加载中...</div>

  return (
    <div>
      {people.map(person => (
        <div key={person.id}>
          <h1>{person.name}</h1>
          <h2>Website: {person.website}</h2>
          Email: <code>{person.email}</code>
        </div>
      ))}
    </div>
  )
}

注意:无论用哪种方案,都要保证调用.map()的变量始终是数组类型,通过默认值、返回值校验的方式做兜底,就能彻底避免这类"读取undefined属性"的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:01:05