Mongoose:如何访问模式方法中的 select:false 属性?

问题描述 投票:0回答:5

快速代码:

var userSchema = new mongoose.Schema({
    username: String,
    password: {type: String, select: false}
});

userSchema.methods.checkPassword = function(password, done) {
    console.log(password);      // Password to check
    console.log(this.password); // stored password
    ...
};

我不希望默认情况下可以访问密码,但我需要一种方法在对用户进行身份验证之前检查用户输入的密码。我知道我可以对数据库进行查询以包含这些值,但我对如何访问架构方法本身的隐藏属性有点迷失。方法本身中的

this
只是返回的查询,所以看起来好像无法访问?我应该在其他地方执行
checkPassword()
功能吗?

mongodb mongoose
5个回答
29
投票

您可以使用

select
选择查询密码。这是一个示例查询。

User.findOne().select('password').exec(callback);

这一定是你要检查的密码。

userSchema.methods.checkPassword = function(password, done) {
    User.findOne({username: this.username}).select('password').exec(function (err, user) {
        if (user.password == password)
            return true;
        else 
            return false;
    });
}

我希望这对你有帮助。


14
投票

您可以明确允许在查找调用中返回密码字段(使用 {select:"false"})在字段前使用“+”运算符例如:

User.findOne({}).select("+password") // "+" = allow select hidden field

0
投票

正确的方法是在方法 findOne 上写入字段。您可以询问您想要返回的字段。在你的情况下,它应该是:

await User.findOne({ username: this.username }, 'password').exec();

文档: mongoose.findOne


0
投票

以上答案仅显示单个属性的选择。

对于多个属性,语法如下:

await this.userModel
      .findOne({ email }, { status: 1, firstName: 1, religion: 1 })
      .exec();

这将返回:

{
  _id: new ObjectId("62de5a5158b809468b812345"),
  status: 'Active',
  firstName: 'John',
  religion: 'Christian Orthodox'
}

0
投票

为了选择隐藏字段,例如设置为

的字段

选择:假

在猫鼬模式中。试试这个。

const data = User.find().select("+password");
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.