javascript - console.log、Object.keys 和 Object.getOwnPropertyNames 之间的不一致

标签 javascript node.js mongoose

我目前正在使用 Mongoose,但是所有这些隐藏的键都让我发疯,并且当这些键突然冒出来时扰乱了我的工作流程。这是我的代码 - 它只是从查找函数中记录文档:

const mongoose = require('mongoose')
const Kitten = mongoose.model('Kitten', mongoose.Schema({ name: String }));

mongoose.connect('mongodb://localhost/test')
mongoose.connection.on('error', console.log)
mongoose.connection.once('open', function() {
    var fluffy = new Kitten({ name: 'fluffy' })
    fluffy.save((err, fluffy) => {
        if (err) return console.error(err);
        Kitten.find({}, (err, docs) => {
            for (var i = 0; i < docs.length; ++i) {
                const doc = docs[i]
                console.log('Object.getOwnPropertyNames ', Object.getOwnPropertyNames(doc))
                console.log('Object.keys ', Object.keys(doc))
                console.log(doc)
                console.log('--')
            }
        })
    })
})

记录的文档之一是 enter image description here

为什么控制台日志显示的 key 既不在 .keys 也不在 .getOwnPropertyNames 中? console.log 输出反射(reflect)了 MongoDB 文档中的实际内容。

编辑:编辑使用更合理的代码

最佳答案

docs 是 Mongoose 文档对象的列表。它们没有可用于枚举的字段,定义了访问器,使它们可用作 doc.fieldName

有文档toObjecttoJSON在需要时将文档对象转换为普通对象的方法。

这里的实际问题是因为不需要文档对象,所以不应该查询它们。可以使用 lean 检索普通对象。

    Kitten.find({}).lean().exec((err, docs) => {
        for (var i = 0; i < docs.length; ++i) {
            const doc = docs[i]
            ...
        }
    });

关于javascript - console.log、Object.keys 和 Object.getOwnPropertyNames 之间的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51813142/

相关文章:

javascript - Angularjs:按数组相交排序和过滤

javascript - 如何在发送响应之前等待进程终止

javascript - 检查 nodejs 连接是否来自本地主机

javascript - Promise 在 forEach 循环完成之前解析

typescript - Mongoose 时间戳已更新通过代码 typescript 访问

javascript - Golang Highcharts 动态数据

javascript - CryptoJS 和 Pycrypto 协同工作

javascript - Ember PromiseArray sortBy

javascript - Angular js - 根据字母 ASCII 值在表中排序

node.js - 使用 Mongoose 自定义连接