【问题标题】:Mongoose hides properties猫鼬隐藏属性
【发布时间】:2018-07-15 12:51:08
【问题描述】:

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

问题:

当我使用console.log('User from DB: '+ dbUser); 时,我看到完全保存的用户。但是,当我尝试访问 dbUser.email 时,我得到了 undefined

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);
})

【问题讨论】:

  • 您是否检查过用户是否实际保存在 db 上?如果没有,您的 User 架构定义可能存在一些问题。
  • 当我打印 console.log('User from DB: '+ dbUser); 时,我看到完全保存的用户。但是我尝试访问 dbUser.email 我得到 undefined
  • 不,我的意思是,你真的用另一个工具检查了数据库吗? Mongoose 默认返回你提供的保存对象。
  • const dbUser = await Database.getUser(newUser._id); 从DB 获取用户,我可以打印并查看。是的,我还检查了 Robo3T,是的。

标签: node.js mongodb mongoose


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    现在,mongoose 将在您每次访问时调用您的 getter 函数 全名属性:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 但是当我打印 dbUser 时,我看到了它的所有属性。我可以在 Mongodb 中看到它。但无法从代码中访问email 属性。
      • 我添加了模型。我在 NodeJS v9.3.0 上使用 Mongoose 5.0.3 尝试了这段代码
      猜你喜欢
      • 1970-01-01
      • 2019-12-30
      • 2021-02-23
      • 2012-11-02
      • 2015-05-31
      • 1970-01-01
      • 2017-10-23
      • 2022-01-12
      • 2011-11-14
      相关资源
      最近更新 更多