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

MongoDB与Next.js数据序列化问题求助:加载数据时遭遇SerializableError

问题:Next.js getServerSideProps 序列化MongoDB数据时出现SerializableError

我尝试将MongoDB中的数据加载到Next.js中,但持续收到以下错误:

SerializableError: Error serializing .jobs[0] returned from getServerSideProps in "/". Reason: undefined cannot be serialized as JSON. Please use null or omit this value.

该数据是通过Python的pymongo存入数据库的。我的实现函数如下:

export async function getServerSideProps(context) {
  const { db } = await connectToDatabase();
  const data = await db
    .collection("alljobs")
    .find()
    .sort({ _id: 1 })
    .limit(40)
    .toArray();
  const jobs = data.map((job) => {
    const company = JSON.parse(JSON.stringify(job.company));
    const impact = JSON.parse(JSON.stringify(job.impact));
    const date = JSON.parse(JSON.stringify(job.date));
    const role = JSON.parse(JSON.stringify(job.role));
    const location = JSON.parse(JSON.stringify(job.location));
    const category = JSON.parse(JSON.stringify(job.category));
    const link = JSON.parse(JSON.stringify(job.link));
    return;
    {
      company: company;
      impact: impact;
      date: date;
      role: role;
      location: location;
      category: category;
      link: link;
    }
  });
  return {
    props: { jobs },
  };
}

我已尝试对所有字段进行序列化处理,但仍无法解决问题,请问有人能提供一些解决思路吗?


解决方案

这个问题的核心原因很容易被忽略——你的map函数里return语句后面多了一个换行,导致你想返回的对象被当成了一个独立的代码块,实际函数返回的是undefined。当Next.js尝试序列化jobs数组时,里面全是undefined,就触发了这个序列化错误。

1. 修复return语句的语法问题

把return和对象放在同一行,或者给对象加上括号,让JavaScript识别出这是要返回的表达式:

const jobs = data.map((job) => {
  const company = JSON.parse(JSON.stringify(job.company));
  const impact = JSON.parse(JSON.stringify(job.impact));
  const date = JSON.parse(JSON.stringify(job.date));
  const role = JSON.parse(JSON.stringify(job.role));
  const location = JSON.parse(JSON.stringify(job.location));
  const category = JSON.parse(JSON.stringify(job.category));
  const link = JSON.parse(JSON.stringify(job.link));
  // 方法1:return和对象在同一行
  return {
    company: company,
    impact: impact,
    date: date,
    role: role,
    location: location,
    category: category,
    link: link,
  };
  // 或者方法2:用括号包裹对象(更简洁的写法)
  // return ({
  //   company, impact, date, role, location, category, link
  // });
});

2. 优化序列化逻辑(可选但推荐)

你现在用JSON.parse(JSON.stringify(...))的方式序列化字段其实没必要,而且如果MongoDB文档里包含_id(ObjectId类型)或者其他不可序列化的类型,这种方式也处理不好。可以直接在查询时排除_id,或者手动转换ObjectId为字符串:

const data = await db
  .collection("alljobs")
  .find({}, { projection: { _id: 0 } }) // 直接排除_id字段,避免序列化问题
  .sort({ _id: 1 })
  .limit(40)
  .toArray();

// 简化map逻辑,同时处理可能的undefined为null
const jobs = data.map(({ company, impact, date, role, location, category, link }) => ({
  company: company ?? null,
  impact: impact ?? null,
  date: date ?? null,
  role: role ?? null,
  location: location ?? null,
  category: category ?? null,
  link: link ?? null,
}));

3. 排查字段是否存在undefined

如果某些字段在MongoDB文档里本身就是缺失的(即值为undefined),可以用??操作符将其替换为null,这样JSON就能正常序列化了——这也是上面代码里做的处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:27:31