Node.js 猫鼬隐藏属性

Node.js 猫鼬隐藏属性,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我使用基本类来封装Mongoose。即使我的查询正确返回用户,我也无法直接访问其属性。以下代码打印user,但将user.email打印为未定义 问题: 当我使用console.log('User from DB:'+dbUser)时我看到完整保存的用户。但是,当我尝试访问dbUser.email时,我没有定义 const UserSchema = mongoose.Schema({ email: {type: String, index: {unique: true, sparse:

我使用基本类来封装Mongoose。即使我的查询正确返回
用户
,我也无法直接访问其属性。以下代码打印user,但将user.email打印为未定义

问题:

当我使用
console.log('User from DB:'+dbUser)时我看到完整保存的用户。但是,当我尝试访问dbUser.email时,我没有定义

const UserSchema = mongoose.Schema({
    email: {type: String, index: {unique: true, sparse: true}},
    password: String,
    createdOn: {type: Date, default:Date.now },
});

const User = mongoose.model("User", UserSchema);
class Database{

    static async getUser(userId) {
        const user = await User.find(userId);
        return user;
    }
}

async function run() {
    await mongoose.connect('mongodb://localhost/stack');
    await Device.remove();
    await User.remove();

    const user = new User({'email':'email@address.com','password':'plainsecret'});
    const newUser = await user.save();
    console.log('New User: ',newUser);
    console.log('Email: ' + newUser.email);
    const dbUser = await Database.getUser(newUser._id);
    console.log('User from DB: '+  dbUser);
    console.log('User email from DB: ' + dbUser.email); //undefined???

    return newUser
}

run().then( (user) => {

    console.log('Done' + user);
    process.exit(0);
}).catch((err) => {
    console.log('Exception' + err);
    process.exit(0);
})

似乎只是没有描述模型中的一些字段。若并没有,mongoose将不会在查询响应对象中添加这些字段。是否确实在用户模型中添加了电子邮件字段?

您需要将
virtuals:true
选项传递到架构定义中

现在,mongoose将在每次访问 全名属性:

console.log(axl.fullName);//Axl Rose

如果使用toJSON()或 toObject()(或在mongoose文档上使用JSON.stringify())mongoose 默认情况下将不包括虚拟对象。将{virtuals:true}传递给 toObject()或toJSON()


这是我这边的一个打字错误。因为
User.find()
返回一个数组,所以当我试图打印它时,它不起作用。更正的代码应该是
User.findById()

您是否检查了用户是否实际保存在数据库中?如果没有,则您的
用户
架构定义可能存在一些问题我看到完整保存的用户。但是,我尝试访问dbUser.email,但我没有定义。我的意思是,您是否确实使用其他工具检查数据库?默认情况下,Mongoose返回为保存而提供的对象。
const dbUser=wait Database.getUser(newUser.\u id)从数据库获取用户,我可以打印并查看它。是的,我也检查过Robo3T,是的,它在那里。但是当我打印dbUser时,我看到了它的所有属性。我可以在Mongodb现场看到它。但是无法从代码访问
电子邮件
属性。我添加了模型。我在NodeJSV9.3.0上用Mongoose5.0.3尝试了这段代码