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

NextJS中从服务端组件传递Mongoose数组数据时如何处理_id?

向Next.js客户端组件传递Mongoose数据的问题与疑问

我当前使用的技术栈:NextJS 15.0.0-rc.0、Mongoose 8.4.1、React 19.0.0-rc-3563387fe3-20240621。

在尝试从服务端组件直接传递Mongoose查询结果到客户端组件时,执行以下代码:

const ingredients = await IngredientModel.find().lean().exec();

会触发如下错误:

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

我通过map将_id转为字符串解决了这个问题:

const transformedIngredients = ingredients.map(ing => {...ing, _id: ing._id.toString()})

但不确定这是不是最优方案。我了解到可以通过虚拟字段获取转为字符串的id,但仍需要通过映射或循环移除原有的_id字段。

还有方案建议通过全局配置toJSON转换,但依然需要遍历每个对象并调用toJSON:

mongoose.plugin((schema) => {
  schema.options.toJSON = {
    virtuals: true,
    versionKey: false,
    transform(doc, ret) {
      ret.id = ret._id;
      delete ret._id;
    }
  };
});

如果存在嵌套/子文档,还需要对每个子文档执行类似的转换操作。

lean查询本来是为了提升性能,但结果仍需转换才能传给客户端;toJSON/toObject速度较慢,但如果本身就要做转换,似乎更合适。全局插件能减少重复代码,但作用有限。

基于以上情况,我有几个疑问:

  1. 如何正确向Next.js客户端组件传递Mongo/Mongoose数据?
  2. 是否可以使用lean查询且无需手动映射,让Mongoose自动转换_id为字符串?
  3. 如何处理嵌套/子文档的转换问题?
  4. 手动映射会不会导致性能下降,尤其是数据包含大量嵌套/子文档字段时?

内容的提问来源于stack exchange,提问作者Merlin -they-them-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:40:04