猫鼬隐藏属性

时间:2018-02-05 15:52:54

标签: node.js mongodb mongoose

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

问题:

当我使用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);
})

3 个答案:

答案 0 :(得分:0)

似乎只是描述了模型中的某些字段。如果不是mongoose不会在查询响应对象中添加这些字段。您确定在用户模型中添加了电子邮件字段吗?

答案 1 :(得分:0)

这是我身边的拼写错误。由于User.find()返回一个数组,因此当我尝试打印时它不起作用。更正后的代码应为User.findById()

答案 2 :(得分:-1)

您需要将virtuals: true选项传递给架构定义。

  

现在,每次访问时,mongoose都会调用你的getter函数   fullName属性:

     

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

     

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

http://mongoosejs.com/docs/guide.html#virtuals