2017-07-06 2 views
0

Mon API utilise SailsJs et MongoDb. Pour la création de l'utilisateur, j'utilise le beforeCreate lifecycle callback pour lancer bcrypt pour hacher mon champ de mot de passe.Définition du champ de mot de passe sur 'required' dans Sails Mongo blocks beforeCréer

Je cette erreur wierd, dans laquelle si je mets mon champ encrPassword à

{required : true} 

mon code cesse de fonctionner et émet l'erreur suivante:

{ 
    "error": "E_VALIDATION", 
    "status": 400, 
    "summary": "1 attribute is invalid", 
    "model": "User", 
    "invalidAttributes": { 
    "encrPassword": [ 
     { 
     "rule": "string", 
     "message": "Value should be a string (instead of null, which is an object)" 
     }, 
     { 
     "rule": "required", 
     "message": "\"required\" validation rule failed for input: null\nSpecifically, it threw an error. Details:\n undefined" 
     } 
    ] 
    } 

voici mon code exemple:

attributes: { 
    fullname : {type : 'string'}, 
    username : {type : 'string', unique:true, required:true}, 
    encrPassword : {type : 'string'}, // ==> this works 
    // encrPassword : {type : 'string', required:true}, ==> this doesn't 
}, 

insert : function(req, cb){ 
    console.log('Insert ', req); 
    if(typeof req.fullName == 'string' && typeof req.username == 'string'){ 
     User.findOne({username : req.username}).exec(function(err, res){ 
      if(!res){ 
       User.create(req).exec(function(err, resp){ 
        console.log('create', null, resp); 
        if(err) 
         cb(err); 
        else cb(null, resp); 
       }); 
      } 
      else cb({message: 'already eists'}) 
     }); 
    } 
    else cb({message: 'Bad Request'}); 
}, 

beforeCreate : function(req, next){ 
    console.log('In bcrypt'); 
    bcrypt.genSalt(10, function(err, salt){ 
     if(err) return next(err); 
     bcrypt.hash(req.password, salt, function(err, hash){ 
      if(err) return next(err); 
      req.encrPassword = hash; 
      delete req.password; 
      console.log('Leaving BCrypt'); 
      next(); 
     }); 
    }); 
} 

ps. J'ai rigoureusement vérifié les fautes de frappe; les fautes de frappe ou de syntaxe dans l'exemple ci-dessus sont le résultat de l'édition pour masquer tout code que je ne voudrais pas partager

Répondre

1

La validation est effectuée avant d'appeler beforeCreate. Il n'y a pas de encrPassword à ce moment-là, d'où l'erreur.