Next JS 中预渲染页面时发生错误

Jov*_*nka 6 javascript next.js

我在下一个 JS(在文件夹中)中创建了一个 API pages/api,并在文件夹中的页面上使用了它pages

当我在localhost上运行时(开发阶段),可以正确调用API。但是当我部署到 Vercel 时,构建过程中出现错误。

vercel 构建错误

pages/api这是我调用文件夹中的 API 时的代码

export const getStaticProps = async () => {
  const baseUrlDribble = 'https://api.dribbble.com/v2';
  const baseUrl = process.env.NODE_ENV === 'production' ?
    'https://jovanka-samudra.vercel.app/api' : 'http://localhost:3000/api';

  const resShots = await fetch(`${baseUrlDribble}/user/shots?access_token=${process.env.TOKEN_DRIBBLE}&page=1&per_page=9`);
  const shots = await resShots.json();

  const resResult = await fetch(`${baseUrl}/projects`);
  const result = await resResult.json();
  const projects = result.data.projects;

  return {
    props: {
      shots,
      projects,
    },
    revalidate: 1,
  }
}
Run Code Online (Sandbox Code Playgroud)

pages/api/projects这是从数据库(文件夹)检索数据的API代码

import ProjectService from "@services/ProjectService";
import connectDB from "@utils/connectDB";
import projectValidator from "@validators/project";
import ClientError from '@exceptions/ClientError';

const handler = async (req, res) => {
  const projectService = new ProjectService();

  if (req.method === 'GET') {
    try {
      const projects = await projectService.getProjects();
  
      return res.status(200).json({
        success: true,
        length: projects.length,
        data: {
          projects
        }
      });
    } catch (error) {
      return res.status(500).json({
        success: false,
        message: error.message,
      });
    }
  } else if (req.method === 'POST') {
    ...
  }

  return res.status(404).json({
    success: false,
    message: 'Method not alowed'
  });
}

export default connectDB(handler);
Run Code Online (Sandbox Code Playgroud)

服务/ProjectService 文件夹

import InvariantError from '@exceptions/InvariantError';
import NotFoundError from '@exceptions/NotFoundError';
import Project from '@models/Project';

class ProjectService {
  async getProjects() {
    const projects = await Project.find().sort({ 'createdAt': -1 });

    return projects;
  }

    ...
}

export default ProjectService;
Run Code Online (Sandbox Code Playgroud)

Ani*_*ony 5

您不应该从 getStaticProps \xe2\x80\x94 获取内部 API 路由,而是可以直接在 getStaticProps 中编写 API 路由中的获取代码。

\n

https://nextjs.org/docs/basic-features/data-fetching/get-static-props#write-server-side-code-directly

\n

  • 这基本上是[这个答案](/sf/answers/4634447611/)的第一句话,没有归属并且遗漏了很多有用的细节 (4认同)