猫鼬:如何在模式方法中访问select:false属性?

enr*_*rez 6 mongoose mongodb

快速代码:

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
    ...
};
Run Code Online (Sandbox Code Playgroud)

我不希望默认情况下可以访问该密码,但是我需要一种在验证用户身份之前对用户输入的密码进行检查的方法。我知道我可以对数据库进行查询以包含这些值,但是我对如何访问架构方法本身的hidden属性有些迷惑。this在方法本身只是返回的查询,所以似乎无法访问?我应该在checkPassword()其他地方执行此功能吗?

Den*_*hov 13

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

User.findOne({}).select("+password") // "+" = allow select hidden field
Run Code Online (Sandbox Code Playgroud)

  • 如果除了其余属性之外您还需要属性,“+”运算符很有用。否则,它只返回该属性,排除所有其他属性。 (2认同)

Kha*_*hay 9

您可以用来select在查询中选择密码。这是一个示例查询。

User.findOne().select('password').exec(callback);
Run Code Online (Sandbox Code Playgroud)

这必须是您要检查密码的密码。

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;
    });
}
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助。