我现在遇到一个问题。
当我在Mongoose的方法中使用关键字this
时,它会返回一个undefined
值,而对于pre
方法,则会得到所要求的值。
我正在使用bcrypt-nodejs和此文件的猫鼬。我不认为问题出在我在API上调用它的方式,因为它在到达方法之前已经正确地找到了。
这是代码:
const mongoose = require('mongoose');
const bcrypt = require('bcrypt-nodejs');
const Schema = mongoose.Schema;
const StaffSchema = new Schema({
firstname: {type: String, required: true},
lastname: {type: String, required: true},
username: {type: String, required: true, unique: true},
email: {type: String, required: true, unique: true},
password: {type: String, required: true},
type: {type: String, required: true},
});
StaffSchema.pre('save', function(next) {
let staff = this;
console.log(staff);
if (!staff.isModified('password')) {
return next();
}
bcrypt.hash(staff.password, null, null, (err, hash) => {
if (err) return next(err);
staff.password = hash;
next();
});
});
StaffSchema.methods.comparePasswords = function(password) {
console.log(password, this.password);
if(this.password != null) {
return bcrypt.compareSync(password, this.password);
} else {
return false;
}
};
module.exports = mongoose.model('Staff', StaffSchema);
答案 0 :(得分:0)
好的,我找到了问题。
永远不要说得太快,问题出在API ...
实际上,在选择时,我删除了密码,因此找不到它。愚蠢的错误,我不好。
我以前有这个,
loginRouter.post('/', (req, res) => {
Staff.findOne({ email: req.body.email })
.select('firstname lastname username email type')
现在是解决方法:
loginRouter.post('/', (req, res) => {
Staff.findOne({ email: req.body.email })
.select('firstname lastname username password email type')