使用猫鼬方法的`this`问题

时间:2018-07-23 08:26:57

标签: node.js mongoose mongoose-schema


我现在遇到一个问题。
当我在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);

1 个答案:

答案 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')