为什么mongoose中的.pre会阻止在下次运行之前访问记录?

时间:2014-03-25 03:14:57

标签: node.js mongodb mongoose

最近我一直用nodejs测试mongoose,我对以下代码的行为有点混淆

在user-db

var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    bcrypt = require('bcrypt'),
    SALT_WORK_FACTOR = 10;

var UserSchema = new Schema({
    username: {type: String, required: true, index: {unique: true}},
    password: {type: String, required: true}
});

UserSchema.pre('save', function(next){
    var user = this;
    // only hash the password if it has been modified (or is newly created)
    if (!user.isModified('password')) return next();
    //generate a salt
    bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt){
        if (err) return next(err);
        // hash the password along with our new salt
        bcrypt.hash(user.password, salt, function(err, hash){
            if(err) return next(err);
            // override the cleartext password with the hashed one
            user.password = hash;
            next();
        });
   });
});

UserSchema.methods.comparePassword = function(candidatePassword, cb){
    bcrypt.compare(candidatePassword, this.password, function(err, isMatch){
        if (err) return cb(err);
        cb(null, isMatch);
    });
};

module.exports = mongoose.model('User', UserSchema);

在用户服务器

var = User = require('./user-db.js');

function test_save(data){
    var compare = new User({
        username: 'compare3',
        password: 'compare3'
    });

    compare.save(function(err){
        if (err) throw err;
    });

    User.findOne({username: 'compare3'}, function(err, user){
        if (err) throw err;

        if (user){
            console.log("you find compare 3");
        }
    });

以下是行为:

如果我想打印

"你会发现compare3"

我必须运行我的app.js一次,使用control-C关闭app.js,然后再次运行,第一次用户的值为null

为什么?我认为.pre并不像我想的那样工作,虽然我认为next()已经解决了这个问题?

任何建议都将不胜感激,谢谢

1 个答案:

答案 0 :(得分:0)

它被称为"callback"

您的代码未以“线性”方式执行,因此 “等待”直到.save()完成。

这就是为什么所有函数都有“回调”“方法。因此,当操作完成时,会调用中的代码:

你的代码需要“内部”,如:

    compare.save(function(err){
        if (err) throw err;

        User.findOne({username: 'compare3'}, function(err, user){
            if (err) throw err;

            if (user){
                console.log("you find compare 3");
            }
        });
    });

然后在保存文档之后执行查找。在它可能尚未保存之前。

如果您打算使用Node.js,那么您需要在创建“非阻塞”程序时扩展您对event loops及相关样式的理解。尝试搜索这些条款,你应该找到大量的信息。