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

从查询结果向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:07:34