5

在我将对象字符串化并将其发送给客户端之前,我从 mongoose 查询中得到了一个结果(对象)并想要替换/删除一些键。

当我 console.log 对象时,一切都很好(列出了所有键,仅此而已)。当我在对象上执行 for..in 时,隐藏字段会突然弹出(而感兴趣的键,不要)。它们是有道理的——它们属于猫鼬——但我不想要它们。在对象上使用 Object.keys 或 Object.getOwnPropertyNames 时也会发生同样的事情 - 隐藏字段弹出窗口,没有用处。

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

现在,两个问题;

  1. 如何正确检查对象,以便我真正获得有关该对象的内部/隐藏信息?
  2. 如何遍历对象并仅获取字段?(是的,我正在 for..in 循环中进行 hasOwnProperty 检查)

//编辑

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

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

这样,我可以遍历 Object.getOwnPropertyNames 并替换/删除我不想让客户知道的键!

4

2 回答 2

4

当您真的只想查看数据时,我猜您正在查看由猫鼬查询返回的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));
});
于 2012-03-10T01:17:25.880 回答
0

此外,如果您想从Document访问某个字段,您可以查看:

文档#get

// path
doc.get('age') // 47

// dynamic casting to a string
doc.get('age', String) // "47"
于 2013-10-28T16:37:43.647 回答