Mongoose Pre Command无法按预期工作

时间:2015-07-10 10:17:47

标签: node.js mongodb mongoose mongodb-query

您好我是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。所以有人可以让我知道我在哪里犯了错误。

1 个答案:

答案 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();   
    });
  });  
});