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

Next.js 15.2.0 App Router:Server传Mongoose数据至Client报Plain Objects错误

解决Next.js App Router中Server Component传递Mongoose文档到Client Component的错误

使用Next.js 15.2.0 App Router时,通过Server Component从MongoDB获取Property文档并传递给Client Component,终端持续报错:

Only plain objects can be passed to Client Components from Server Components. Objects with toJSON methods are not supported. Convert it manually to a simple value before passing it to props. {{_id: {buffer: ...}}

Server组件代码

interface PropertyPageProps {
  params: { id: string };
}

export default async function PropertyPage({ params }: PropertyPageProps) {
  const { id } = params;

  // Fetch the property from MongoDB using Mongoose
  const dbProperty = await PropertyModel.findById(id)

  if (!dbProperty) {
    return <div>Property not found.</div>;
  }

  return (
    <main>
      <h1>Property Page</h1>
      <PropertyDetailsClient property={dbProperty} />
    </main>
  );
}

Client组件代码

'use client';

interface PropertyDetailsClientProps {
  property: {
    _id: string; 
    // ... other properties ...
  };
}

export default function PropertyDetailsClient({ property }: PropertyDetailsClientProps) {
  return (
    <div className="property-details">
      <h2>{property.name}</h2>
      <p>ID: {property._id}</p>
      <p>Created At: {new Date(property.createdAt).toLocaleDateString()}</p>
    </div>
  );
}

问题原因

直接传递Mongoose返回的文档对象给Client Component是错误操作。Mongoose文档不是纯JavaScript对象,它包含toJSON等内置方法和内部属性(比如_id是ObjectId类型而非字符串),Next.js禁止将这类非纯对象从Server组件传递到Client组件。

解决方法

方法1:将Mongoose文档转为纯对象

在传递前调用.toObject()或.toJSON()方法,把文档转换为纯JS对象:

// 在Server组件中修改数据处理逻辑
const property = dbProperty.toObject();
// 若需要将ObjectId转为字符串,可手动处理
const property = {
  ...dbProperty.toObject(),
  _id: dbProperty._id.toString(),
  createdAt: dbProperty.createdAt.toISOString() // 提前转成字符串,避免Client端日期处理问题
};

// 传递给Client组件
<PropertyDetailsClient property={property} />

方法2:仅传递Client组件需要的字段

不传递整个文档,只提取所需属性,既符合规则又更高效:

// 在Server组件中提取必要字段
const property = {
  _id: dbProperty._id.toString(),
  name: dbProperty.name,
  createdAt: dbProperty.createdAt.toISOString(),
  // 其他Client组件需要的字段...
};

// 传递给Client组件
<PropertyDetailsClient property={property} />

以上两种方法都能让传递的props成为纯JavaScript对象,符合Next.js Server/Client组件的数据传递规则,彻底消除错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:42:31