在Next.js中预取数据时遇到问题

mftmpeh8  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(82)

我有一个简单的虚拟API,它返回一个对象数组,例如:

// api/projectsdata.js

    export default function handler(req, res) {
      res.status(200).json([{...},{...},{...}]
    }

字符串
我的fetch API看起来像这样:

import { useEffect, useState } from "react";

const ProjectsUtil = () => {
  const [data, setData] = useState(null);

  const fetchData = async () => {
    try {
      const response = await fetch("http://localhost:3000/api/projectsdata");
      const data = await response.json();

      if (response.ok) {
        setData(data);
      }
    } catch (error) {
      throw new Error(error);
    }
  };

  useEffect(() => {
    fetchData();
  }, []);

  return data !== null && data;
};

export default ProjectsUtil;


我尝试使用下面的两个辅助函数来获取:

export const getAllProjects = () => {
  const data = ProjectsUtil();
  return data;
};

export const getProjectByName = (name) => {
  const data = getAllProjects();
  return data.filter((project) => project.name === name);
};


在另一个组件中,我尝试预取和使用数据,例如:

const SingleProjectDetails = (props) => {
  return <ProjectDetails props={props.projectData[0]} />;
};

export function getStaticProps(context) {
  const { params } = context;
  const { id } = params;
  const projectData = getProjectByName(id);

  return {
    props: {
      projectData: projectData,
    },
    revalidate: 600,
  };
}

export function getStaticPaths() {
  const projectsData = getAllProjects();

  return {
    paths: projectsData.map((project) => ({
      params: {
        id: project.name,
      },
    })),
    fallback: true,
  };
}


我得到一个错误:TypeError: Cannot read properties of null (reading 'useState')的。
令人困惑的是,我的抓取API函数在其他组件中工作得很好。另外,如果我将虚拟数据初始化为对象的普通数组,而不是来自API的调用,则一切正常。有什么问题吗?是否不允许预取API?

wko9yo5t

wko9yo5t1#

您正在调用常规函数中的Function组件。这不管用
相反,您可以将fetchData函数提取到顶级函数中,返回数据而不是通过setter设置数据,并在getAllProjects函数中使用此fetchData函数。
别忘了等待数据。

相关问题