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

Next.js 14.1 SSR数据获取返回undefined问题排查与解决

解决Next.js SSR获取数据返回undefined的问题

问题分析

从你提供的代码来看,导致数据返回undefined的核心原因有以下几点:

  • 变量大小写不匹配:Dashboard组件接收的props是serverData,但传递给Container组件时写成了小写的serverdata,子组件自然拿不到正确数据。
  • 未处理未登录场景:如果用户未登录,getServerSession会返回null,此时userId为undefined,直接传入getServer会导致Prisma查询条件无效,甚至触发类型错误。
  • 缺少错误处理:getServerSideProps中没有捕获getServer抛出的异常,一旦查询出错会直接导致页面渲染失败。

修复方案

1. 修正变量大小写错误

修改Dashboard组件中传递给Container的props名称,保持和接收的serverData一致:

import Container from "./Container";
import { getServerSession } from "next-auth/next";
import { authConfig } from "../../lib/auth";
import { getServer } from "@/app/api/servers";

export const getServerSideProps = async (context) => {
  const session = await getServerSession(context.req, context.res, authConfig);
  const userId = session?.user.id;

  let serverData = [];
  if (userId) {
    try {
      serverData = await getServer(userId);
    } catch (error) {
      console.error("获取服务器数据失败:", error);
      // 可选:这里可以添加错误日志或返回默认数据
    }
  }

  return { props: { serverData } };
};

const Dashboard = ({ serverData }) => {
  return (
    <div className="w-full min-h-full p-4 border-b-2 border-t-2 border-t-white border-b-cyan-100 shadow-lg  mb-8 h-80 min-h-72">
      <div className="w-full h-full flex flex-row gap-5">
        {/* 修正大小写:serverData 而非 serverdata */}
        <Container serverData={serverData} />
      </div>
    </div>
  );
};

export default Dashboard;

2. 完善getServer函数的类型校验

给getServer函数添加参数校验,避免传入undefined导致查询异常:

export const getServer = async (userId?: string) => {
  console.log("getServer", userId);
  if (!userId) {
    console.warn("未提供用户ID,返回空数组");
    return [];
  }
  
  try {
    const servers = await prisma.server.findMany({
      where: {
        userId: userId,
      },
    });
    return servers;
  } catch (error) {
    console.error("获取服务器数据错误:", error);
    throw error;
  }
};

3. 处理未登录用户的重定向(可选)

如果Dashboard页面需要用户登录才能访问,可以在getServerSideProps中添加重定向逻辑:

export const getServerSideProps = async (context) => {
  const session = await getServerSession(context.req, context.res, authConfig);
  
  if (!session) {
    return {
      redirect: {
        destination: "/login",
        permanent: false,
      },
    };
  }

  const userId = session.user.id;
  let serverData = [];
  try {
    serverData = await getServer(userId);
  } catch (error) {
    console.error("获取服务器数据失败:", error);
  }

  return { props: { serverData } };
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:46:01