您好我是Mongoose的新手并尝试使用pre命令将String中的给定密码转换为Hash值,然后将其保存在数据库中。我没有收到任何语法错误,但我的密码没有转换为Hash 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。所以有人可以让我知道我在哪里犯了错误。
答案 0 :(得分:1)
你的代码有各种各样的错误,主要部分是钩子应该附加到架构而不是模型,这似乎是你的意思做。
此外,看起来你正在尝试为每个请求添加一个预保存挂钩,这不是挂钩应该如何工作的:它们应该只在架构上声明一次(如上所述)和< em>在之前创建模型。
订单应与此类似:
var UserSchema = new mongoose.Schema(...);
UserSchema.pre('save', ...);
var User = mongoose.Model(UserSchema);
这意味着您无法从预保存挂钩发送错误响应,就像您现在尝试做的那样,但是您真的不希望这样做IMO(您应该将Mongoose模式/模型分开)从你的快递路线处理程序)。相反,捕获.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();
});
});
});