如何检查/迭代节点中的对象?

我从一个mongoose的查询中得到一个结果(对象),并且想要replace/删除一些键,然后将对象string化并发送给客户端。

当我console.log对象,一切都很好(所有的键列出,没有更多)。 当我在对象上做一个for … in时,隐藏的字段不知从哪儿跳出来(和关键的关键字不要)。 他们有道理 – 他们属于mongoose – 但我不想要他们。 同样的事情发生,当在对象 – 隐藏的字段popup使用Object.keys或Object.getOwnPropertyNames,没有用。

所以我想用util.inspect(obj,true,null,true)检查元素并将结果logging到控制台。 在控制台上的结果是一样的,就像我控制台。没有检查直接对象。

现在有两个问题;

  1. 我如何正确地检查一个对象,以便实际获得关于对象的内部/隐藏信息?
  2. 我如何迭代对象,只获取字段? (是的,我正在做for..in循环中的hasOwnProperty检查)

//编辑

好,我知道了。 经过一番调查,我意识到,mongoose对象代理它的属性,并有一个toJSON函数,这就解释了为什么console.logs在预期的输出结构中。 解决scheme是使用Mongoose自己的toObject方法;

mongooseObj.toObject({ getters: true, virtuals: false }) 

这样,我可以迭代Object.getOwnPropertyNames并replace/删除我不想让客户端知道的密钥!

我会猜测你正在查看由mongoose查询返回的Document对象,当你真的只想看到数据。 如果我的猜测是正确的,你可能会想要这样的东西:

 Model.findOne({ name: 'john' }, function (err, doc) { var data = doc.toObject(); // do whatever you need to with data delete data.age; delete data.weight; data.isAwesome = true; // now stringify the data and do something with it callback(JSON.stringify(data)); }); 

另外,如果您想从文档访问某个字段,您可以查看:

文档#得到

 // path doc.get('age') // 47 // dynamic casting to a string doc.get('age', String) // "47"