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

Vercel部署Next.js应用遇TypeError: items.map不是函数问题求助

问题:Vercel部署Next.js应用时出现TypeError: items.map is not a function错误

错误信息

TypeError: items.map is not a function
at SearchResults (/vercel/path0/.next/server/app/exercises/page.js:568:29)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

Error occurred prerendering page "/exercises". Read more: https://nextjs.org/docs/messages/prerender-error
TypeError: items.map is not a function
at SearchResults (/vercel/path0/.next/server/app/exercises/page.js:568:29)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

相关代码

SearchResults组件

import React from "react";
import getAll from "@/lib/getAll";
import ResultItem from "./ResultItem";
import { Exercise } from "@prisma/client";

export default async function SearchResults() {
  const items: Exercise[] = await getAll();
  return (
    <div>
      <div>
        {items.map((item: Exercise) => {
          return (
            <ResultItem
              key={item.id}
              id={item.id}
              title={item.name}
              image={item.image}
            />
          );
        })}
      </div>
    </div>
  );
}

getAll函数

export default async function getAll() {
  const res = await fetch(`${process.env.CLIENT_URL}/api/exercises`);
  if (!res.ok) return new Error("Failed to fetch data");
  return res.json();
}

已知情况

本地测试及执行next build均无报错,硬编码items变量值可正常渲染,但Vercel部署时预渲染页面出现上述错误。


解决思路

  • 校验API返回数据格式
    本地与Vercel环境下API返回的数据可能存在差异:本地返回数组,但Vercel上可能返回包裹数组的对象(如{ data: [...] }),或因环境变量错误请求了无效地址,导致返回非数组数据。建议在getAll函数中添加日志打印返回结果,或查看Vercel部署日志中的请求详情。

  • 修复错误返回逻辑
    当前getAll在请求失败时返回Error对象,而非数组,预渲染时若请求失败,items会是Error类型,调用map必然报错。修改getAll确保始终返回数组:

    export default async function getAll() {
      try {
        const res = await fetch(`${process.env.CLIENT_URL}/api/exercises`);
        if (!res.ok) {
          console.error("请求失败:", res.status, res.statusText);
          return [];
        }
        const data = await res.json();
        // 兼容API返回对象包裹数组的情况
        return Array.isArray(data) ? data : (data?.data || []);
      } catch (err) {
        console.error("请求异常:", err);
        return [];
      }
    }
    
  • 添加运行时类型校验
    TypeScript类型标注仅在编译时生效,无法保证运行时数据类型。在组件中添加校验逻辑:

    export default async function SearchResults() {
      const items = await getAll();
      if (!Array.isArray(items)) {
        console.error("items不是数组:", items);
        return <div>加载失败</div>;
      }
      return (
        <div>
          <div>
            {items.map((item: Exercise) => (
              <ResultItem
                key={item.id}
                id={item.id}
                title={item.name}
                image={item.image}
              />
            ))}
          </div>
        </div>
      );
    }
    
  • 检查Vercel环境变量
    确认Vercel项目中CLIENT_URL环境变量是否正确配置,避免因地址错误请求到无效API端点。

  • 直接调用数据库查询(替代内部API请求)
    预渲染阶段调用同应用内的API路由可能存在问题,可直接在getAll中使用Prisma查询数据,跳过网络请求:

    import { prisma } from "@/lib/prisma";
    
    export default async function getAll() {
      try {
        return await prisma.exercise.findMany();
      } catch (err) {
        console.error("数据库查询失败:", err);
        return [];
      }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:22:04