为何向Participant对象添加status属性后,对象打印无该属性但单独打印有值?
动态添加属性到Mongoose文档后不显示?看这篇就懂了
我之前也碰到过一模一样的问题!你遇到的情况本质上是Mongoose返回的文档对象不是普通JavaScript对象导致的,具体原因和解决办法我给你理清楚:
核心原因
Mongoose Document的特殊性
你从invitation.participants拿到的每个participant是Mongoose的Document实例,不是纯JS对象。这种对象有自己的内部数据结构,它会管理哪些字段属于数据库Schema定义的部分,动态添加的属性不会被纳入它的“官方字段”列表。序列化规则的限制
当你console.log(participant)或者用res.send返回时,Mongoose会自动把Document序列化成JSON,但这个过程只会包含Schema里定义的字段——你临时加的status不在Schema里,所以不会被显示。不过因为JS本身允许给对象动态加属性,你单独访问participant.status时还是能拿到值的。
几种解决方案
方案1:转成普通JavaScript对象
最直接的办法就是把Mongoose Document转成纯JS对象,这样后续添加的属性就会和普通对象一样被序列化:
for (let index = 0; index < participants.length; index++) { // 用toObject()转成普通对象 var participant = participants[index].toObject(); const member = await Member.findOne({ loginId : participant.phoneNumber }) if (member) { const memberInvitation = await MemberInvitation.findOne({ memberId : member._id }) if (memberInvitation) { participant.status = memberInvitation.status console.log(participant.status) console.log(participant) // 现在能看到status属性了 } } }
方案2:用Mongoose的set()方法添加属性
如果不想转成普通对象,也可以用Mongoose Document自带的set()方法,它会把属性添加到文档的可序列化字段中:
if (memberInvitation) { // 用set()方法添加属性 participant.set('status', memberInvitation.status); console.log(participant.status) console.log(participant) // 同样能看到status }
方案3:在Schema中提前定义status字段
如果status是这个集合长期需要的属性,不如直接在Participant的Schema里添加这个字段(可以设为可选):
// 示例Participant Schema const participantSchema = new mongoose.Schema({ name: String, phoneNumber: String, // 添加status字段,设为可选 status: { type: String, default: 'PENDING' } });
这样从数据库查出来的文档本身就有status字段,直接赋值后自然会被序列化显示。
内容的提问来源于stack exchange,提问作者Anders Cheow
相关产品推荐
相关产品推荐

