我试图在发送之前使用mongoose getter来强制转换所有用户密码。它完美地运作。 但是,在方法" comparePassword"上,我需要使用passwordstring来比较我可以进行身份验证的内容。
有没有办法在猫鼬的某些条件下绕过吸气剂?提前致谢!
代码示例:
function castpassword (pw) {
return 'keyboard cat';
}
var AccountSchema = new Schema({
password: { type: String, get: castpassword }
});
AccountSchema.methods.comparePassword = function (candidatePassword, cb) {
// random hash vs keyborad cat === not authenticated
crypt.compare(candidatePassword, this.password, function (err, isMatch) {
if (err) return cb(err);
cb(null, isMatch);
});
};
....
Account.findById( someId, function (err, found) {
console.log(found.password); // 'keyboard cat'
});
答案 0 :(得分:2)
在mongoose中使用 this.toObject()将绕过mongoose中的所有getter和setter设置,因为它将其更改为普通JSON数据
AccountSchema.methods.comparePassword = function (candidatePassword, cb) {
// keyboard cat vs keyboard cat === authenticated
crypt.compare(candidatePassword, this.toObject().password, function (err, isMatch) {
if (err) return cb(err);
cb(null, isMatch);
});
};
答案 1 :(得分:1)
您可以使用mongoose'lean'跳过所有猫鼬魔法,然后拔出一个json对象。
Account
.findById(someId)
.lean()
.exec(function (err, found) {
console.log(found.password); // actual password
// you can not use mongoose functions here ex:
// found.save() will fail
})
另一种选择是在架构中将密码设置为'select:false'。
var AccountSchema = new Schema({
password: { type: String, select: false }
});
这样一来,当你拿出文件的时候,密码字段根本就不会存在,除非你专门用它。
Account
.findById(someId, function (err, found) {
console.log(found.password); // undefinded
})
Account
.findById(someId)
.select('password') // explicitly asking for password
.exec(function (err, found) {
console.log(found.password); // actual password
})