mongoosePre命令不按预期工作

嗨,我是新来的mongoose试图使用pre命令转换给定的密码在string哈希值之前,将其保存在数据库中。 我没有得到任何语法错误,但我的密码没有被转换成散列IDS。

我的控制器代码如下:

User.save(req.body,function(err,data){ if (err) { res.json({ sucess:false, exception:err }); } else{ res.json({ sucess:true, User:data }); } }); User.pre('save',function(next){ bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt){ if(err){ return res.json({ success:false, exception:err }); } bcrypt.hash(password, salt, function(err, hash) { if(err){ return res.json({ success:false, exception:err }); } password=hash; }); }); next(); }); 

使用节点检查器,我发现命令行不进入User.pre。所以有人可以让我知道我犯了一个错误。

你的代码有各种各样的错误,主要部分是钩子应该被附加到模式,而不是模型 ,这似乎是你在做什么。

另外,它看起来像是试图为每个请求添加一个预保存钩子,而不是钩子应该如何工作:它们应该在架构(如上所述)上声明一次,并且创build模型。

顺序应该是这样的:

 var UserSchema = new mongoose.Schema(...); UserSchema.pre('save', ...); var User = mongoose.Model(UserSchema); 

这意味着你不能像你现在要做的那样从预保存钩子发送一个错误响应,但是你真的不需要那么做IMO(你应该保持你的Mongoose模式/模型与你的Express分离路由处理程序)。 而是捕获.save()期间抛出的任何错误,并在那里处理它们。

为了给出一个适当的钩子可能看起来像一个想法,这里是一个例子(我猜你的User架构,所以它可能会使用错误的字段名称):

 UserSchema.pre('save', function(next) { var document = this; bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) { if (err) return next(err); bcrypt.hash(document.password, salt, function(err, hash) { if (err) return next(err); document.password = hash; next(); }); }); });