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速度较慢,但如果本身就要做转换,似乎更合适。全局插件能减少重复代码,但作用有限。
基于以上情况,我有几个疑问:
- 如何正确向Next.js客户端组件传递Mongo/Mongoose数据?
- 是否可以使用
lean查询且无需手动映射,让Mongoose自动转换_id为字符串? - 如何处理嵌套/子文档的转换问题?
- 手动映射会不会导致性能下降,尤其是数据包含大量嵌套/子文档字段时?
内容的提问来源于stack exchange,提问作者Merlin -they-them-
相关产品推荐
相关产品推荐

