【问题标题】:Mongoose Pre Command not working as ExpectedMongoose Pre 命令未按预期工作
【发布时间】:2015-07-10 19:05:21
【问题描述】:

您好,我是 Mongoose 的新手,并尝试使用 pre 命令将字符串中的给定密码转换为哈希值,然后再将其保存到数据库中。我没有收到任何语法错误,但我的密码没有转换为哈希 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 。所以有人可以告诉我我在哪里犯了错误。

【问题讨论】:

  • 用户必须是您的架构,是吗?还是模型?替换字符串密码=哈希;到 this.password = hash
  • 用户是我代码中的模型。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

你的代码有很多问题,主要是钩子应该附加到 schema 而不是 model,这似乎是你的样子做。

此外,您似乎正在尝试为每个请求添加一个预保存钩子,这不是钩子应该如何工作的:它们应该只在架构上声明一次(如上所述)并且 在您创建模型之前。

顺序应该是这样的:

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

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 2017-04-26
    • 2018-09-16
    • 2021-11-25
    • 2020-05-23
    • 2016-09-29
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多