从查询结果向JavaScript对象添加属性后控制台不显示的问题
问题分析与解决方案
嘿,我懂你遇到的这个小困惑了——明明给每个对象都加上了convertedPrice属性,单独访问能拿到值,但打印整个数组时就是看不到这个属性对吧?这其实和你用Mongoose操作MongoDB返回的对象类型有关。
问题根源
Mongoose查询返回的results里的每个元素是Mongoose Document实例,不是普通的JavaScript对象。这类实例的属性有特殊的枚举规则:数据库里原本存在的字段是可枚举的,但你手动新增的convertedPrice是直接挂在实例上的非枚举属性,所以控制台打印整个数组/对象时,默认不会显示这些新增的非枚举属性,但直接访问属性是可以拿到值的。
两种解决办法
办法1:把Document转为普通JS对象
在处理每个对象前,用toObject()方法把它转成普通对象,之后新增的属性就会成为可枚举属性,打印时就能看到了:
function getAllExperiences(){ return new Promise(function(resolve,reject){ Experiences.find({status:'live'},function(err,results){ if(err){ reject(err); } else { var finalResult = []; results.forEach(function(objs){ // 转成普通JS对象 const plainObj = objs.toObject(); plainObj.convertedPrice = 'aaaaaaaaaa'; finalResult.push(plainObj); }); console.log(finalResult[0].convertedPrice) console.log(finalResult) resolve(finalResult); } }); }); }
办法2:查询时使用lean()
如果你不需要Mongoose Document的特殊方法(比如save()),可以在查询时加上lean(),让Mongoose直接返回普通JS对象,这样新增属性之后打印就能直接看到:
function getAllExperiences(){ return new Promise(function(resolve,reject){ // 加上lean(),返回普通JS对象数组 Experiences.find({status:'live'}).lean().exec(function(err,results){ if(err){ reject(err); } else { var finalResult = []; results.forEach(function(objs){ objs.convertedPrice = 'aaaaaaaaaa'; finalResult.push(objs); }); console.log(finalResult[0].convertedPrice) console.log(finalResult) resolve(finalResult); } }); }); }
这两种方法都能解决你遇到的控制台打印问题,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者lokesh jain
相关产品推荐
相关产品推荐

