错误:如何从 getStaticProps 序列化数据:Next.js

Posted

技术标签:

【中文标题】错误:如何从 getStaticProps 序列化数据:Next.js【英文标题】:Error: How to serialize data from getStaticProps : Next.js 【发布时间】:2021-05-12 08:42:45 【问题描述】:

我正在使用 Next.js,我尝试访问数据但收到此错误:

Error: Error serializing `.profileData` returned from `getStaticProps` in "/profile/[slug]".
Reason: `undefined` cannot be serialized as JSON. Please use `null` or omit this value.

我的代码:

import  getAllBusinessProfiles  from '../../lib/api';

const Profile = ( allProfiles:  edges  ) => 
    return ( 
        <>
          <Head>
            <title>Profile</title>
          </Head>

          <Hero />

          <section>
            edges.map(( node ) => (
              <div key=node.id>
                  <Link href=`/profile/$node.slug`>
                    <a> node.businessInfo.name </a>
                  </Link>
              </div>
            ))
          </section>

        </>
     );

 
export default Profile;

export async function getStaticProps() 
    const allProfiles = await getAllBusinessProfiles();
    return 
      props: 
        allProfiles
      
    ;
  

从 api.js 获取所有业务配置文件:

const API_URL = process.env.WP_API_URL;

async function fetchAPI(query,  variables  = ) 
  const headers =  'Content-Type': 'application/json' ;

  const res = await fetch(API_URL, 
    method: 'POST',
    headers,
    body: JSON.stringify( query, variables )
  );

  const json = await res.json();
  if (json.errors) 
    console.log(json.errors);
    console.log('error details', query, variables);
    throw new Error('Failed to fetch API');
  
  return json.data;


export async function getAllBusinessProfiles() 
    const data = await fetchAPI(
      `
      query AllProfiles 
        businessProfiles(where: orderby: field: DATE, order: ASC) 
          edges 
            node 
              date
              title
              slug
              link
              uri
              businessInfo 
                name
                title
                company
                image 
                  mediaItemUrl
                  altText
                
                highlight
                phone
                city
                country
                facebook
                instagram
                email
                website
                profiles 
                  profile
                  profileInfo
                
                extendedProfile 
                  title
                  info
                
              
            
          
        
      
      
      `
    );
    return data?.businessProfiles;
;

这可能是什么错误?我在 Next.js 上使用了 getStaticProps 方法,但得到了上面的错误。请检查。谢谢。

错误: 服务器错误 错误:序列化从“/profile/[slug]”中的getStaticProps 返回的.profileData 时出错。 原因:undefined 无法序列化为 JSON。请使用null 或省略此值。

我不知道是什么原因造成的。

【问题讨论】:

重复我在上一个问题中提到的内容:allProfiles 对象中的某些字段是undefined,它不能作为 JSON 序列化,因此无法从 getStaticProps 返回。将它们转换为 null 或完全忽略它们。 我将如何解决它?请 我投票结束这个问题,因为同一个用户已经问过这个问题:***.com/questions/66102884/… 你修好了吗? 我有同样的错误。你能解决它吗? 【参考方案1】:

在调用返回对象的异步函数时添加JSON.stringify

尝试像这样修改您的 getStaticProps 函数。

export async function getStaticProps() 
    const profiles = await getAllBusinessProfiles();
    const allProfiles = JSON.stringify(profiles)

    return 
        props: 
             allProfiles
        
   ;

JSON.stringify() 方法将 javascript 对象或值转换为 JSON 字符串,如果指定了替换函数,则可选择替换值,如果指定了替换数组,则可选择仅包含指定的属性。

来源:MDN

【讨论】:

【参考方案2】:

我在使用 Mongoose 和 Next.js 时遇到了这个问题。

为了解决这个问题:我从 convert require 切换到 import 然后将结果包装在 JSON.parse(JSON.stringify(result)); 中。

好: import mongoose from 'mongoose';

不好: const mongoose = require('mongoose');

【讨论】:

【参考方案3】:

我在使用下一个 js 使用 redux 时遇到了同样的问题,原因是我将默认状态下的字段之一设置为未定义:

const INITIAL_STATE = 
  products: [],
  loading: false,
  error: undefined,
  cart: [],
;

error:undefined 导致了错误。因为“未定义”无法序列化:

export async function getStaticProps() 
    const allProfiles = await getAllBusinessProfiles();
    return 
      props: 
        allProfiles
      
    ;
  

您正在返回“allProfiles”,这是异步getAllBusinessProfiles() 的结果,它要么返回未定义、错误,要么返回对象的字段之一未定义。 “错误”对象在 javascript 中不可序列化

【讨论】:

我试图从getStaticProps 导出布尔值context.preview,而每当我退出预览模式时,该值就会出现undefined。我只是返回了!!context.preview,错误就解决了。【参考方案4】:

我在访问getStaticProps 中的 Vercel 系统环境变量时遇到了同样的序列化错误。

使用JSON.stringify 没有成功,但String() 有效。我的代码:

export async function getStaticProps() 
  const deploymentURL = String(process.env.NEXT_PUBLIC_VERCEL_URL);

  return 
    props: 
      deploymentURL,
    ,
  ;

感谢this GitHub issue 的启发

【讨论】:

【参考方案5】:

试试这个,它对我有用:

export async function getStaticProps() 
  const APP_URL = process.env.PUBLIC_NEXT_WEB_APP_URL;
  const res = await fetch(`$APP_URL/api/projects`);
  const projects = await res.json();
  return 
    props: 
      projects: projects?.data,
    ,
  ;

【讨论】:

【参考方案6】:

我在尝试使用 id 在数据数组中查找匹配项时遇到了同样的问题。我遇到的问题是数组中的项目的 id 是数字,而我从 params 获得的值是一个字符串。所以我所做的就是将数字 id 转换为字符串以匹配比较。

export async function getStaticProps( params ) 
  const coffeeStore = coffeeStoreData.find(
    (store) => store.id.toString() === params.slug[0]
  );
  return 
    props: 
      coffeeStore,
    ,
  ;

【讨论】:

以上是关于错误:如何从 getStaticProps 序列化数据:Next.js的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到“错误:序列化从 getStaticProps 返回的 ___ 时出错”?

在 getStaticProps 函数中序列化 Next.js 时出错?

如何干净地处理 nextjs getStaticProps 中的错误

如何从 getStaticProps 返回重定向而不从 TypeScript 出错?

NextJS:通过上下文将字符串从输入传递到 getStaticProps

如何从`getStaticProps`向API路由发出请求