我使用基本类来封装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);
})
答案 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()。