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

NextJS报错TypeError: productList.map is not a function求助

解决NextJS中productList.map不是函数的错误

问题根源

TypeError: productList.map is not a function 直接说明你尝试在非数组类型的数据上调用数组方法map。导致这个问题的常见原因:

  • 接口http://localhost:3000/api/products返回的不是直接的数组,而是嵌套在对象中的数组(比如{ products: [...] }或{ data: [...] })
  • 接口请求失败,返回了错误对象、null或其他非数组数据
  • 数据传递过程中被意外修改为非数组类型

解决步骤

1. 确认接口返回的数据结构

在getServerSideProps中打印接口返回的完整数据,明确res.data的结构:

export const getServerSideProps = async () => {
    const res = await axios.get("http://localhost:3000/api/products");
    console.log('接口返回数据:', res.data); // 在终端查看输出
    return {
        props: {
            productList: res.data
        }
    }
};

如果终端输出显示res.data是包含数组的对象(比如{ products: [...] }),则调整取值逻辑:

// 示例:假设接口返回{ products: [...] },取对应数组字段
productList: res.data.products

2. 给productList设置默认空数组

在ProductList组件中给参数设置默认值,确保即使productList为undefined或非数组,也能安全调用map:

const ProductList = ({ productList = [] }) => { // 默认空数组
  return (
    <div className={styles.container}>
        <h1 className={styles.title}>THE BEST PIZZA IN TOWN</h1>
        <p className={styles.desc}>Lorem ipsum dolor sit amet consectetur adipisicing elit. Sint, nemo at, labore porro reiciendis rem ad tempora blanditiis adipisci a eum animi obcaecati, dignissimos non perspiciatis natus corrupti consectetur libero.</p>
        <div className={styles.wrapper}>
          {productList.map(product => (
             <ProductCard key={product._id} product={product} />
          ))}
        </div>
    </div>
  );
};

3. 渲染前判断数据类型(可选)

如果需要更严谨的逻辑,在渲染map前先确认productList是数组:

<div className={styles.wrapper}>
  {Array.isArray(productList) ? 
    productList.map(product => (
      <ProductCard key={product._id} product={product} />
    )) : 
    <p>暂无产品数据</p>
  }
</div>

4. 处理接口请求异常

给getServerSideProps添加异常捕获,避免请求失败时传递错误数据:

export const getServerSideProps = async () => {
    try {
        const res = await axios.get("http://localhost:3000/api/products");
        // 确保返回的是数组,否则转为空数组
        const productList = Array.isArray(res.data) ? res.data : [];
        return {
            props: {
                productList
            }
        }
    } catch (error) {
        console.error('获取产品数据失败:', error);
        return {
            props: {
                productList: [] // 请求失败时返回空数组
            }
        }
    }
};

内容的提问来源于stack exchange,提问作者Ogi Bin Edi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:49:15