最近我一直用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()已经解决了这个问题?
任何建议都将不胜感激,谢谢
答案 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及相关样式的理解。尝试搜索这些条款,你应该找到大量的信息。