2016-05-30 2 views
0

Ich versuche, ein Passwort direkt vor dem Speichern eines Dokuments zu hashen. Ich versuche, einen Hash zu generieren (was gut funktioniert) und dann das Passwort-Feld des Dokuments (ein String-Typ) mit dem neuen Hash-Passwort zu aktualisieren.Warum wird mein Mungo-Dokument innerhalb der bcrypt-Funktionen nicht korrekt aktualisiert?

Die Zeile user.password = hash ändert jedoch nichts.

Ich überprüfe meine Datenbank und nichts hat sich geändert! Was noch seltsamer ist, ist, dass, wenn ich versuche, die Daten meines Dokuments außerhalb die Hash/bcrypt Funktionen zu ändern, funktioniert es gut.

Zum Beispiel, wenn ich mein Dokument mit dem Kennwort initialisieren „fake1“ und setzte dann user.password = "fakepassword" außerhalb meiner Hashing-Funktionen, aktualisiert sie es in Ordnung ....

Warum ist das so? Ändert sich die Referenznummer this, wenn Sie Hashfunktionen eingeben? Jedes Beispiel (ich habe stundenlang gesucht), das ich gesehen habe, ist genau wie meines ... Warum funktioniert meines nicht?

userSchema.pre('save', function(next) { 
    var user = this; // i reference the doc by "this" 
    bcrypt.genSalt(SALT_WORK_FACTOR, function(err,salt){  
     if(err){ 
      console.log("error with salt \n"); 
     } 
      bcrypt.hash(user.password,salt,function(error,hash){ 
       if (error){ 
        console.log("error with hash \n"); 
       } 
       user.password = hash; // this line doesn't do anything! 

      }); 
    });   
    return next(user);                                      
}); 

Antwort

1

sollten Sie next() nennen, wenn der asynchrone bcrypt Code ausgeführt wird. Jetzt rufen Sie es an, ohne auf das Ergebnis bcrypt.genSalt/bcrypt.hash zu warten.

Auch das an next übergebene Argument ist für Fehler reserviert. Sie sollten next ohne ein Argument anrufen, wenn alles in Ordnung ging.

Hier ist ein aufgeräumt Version Ihrer Middleware:

userSchema.pre('save', function(next) { 
    var user = this; 
    bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) { 
    if (err) { 
     console.log("error with salt \n"); 
     // Pass error back to Mongoose. 
     return next(err); 
    } 
    bcrypt.hash(user.password, salt, function(error, hash) { 
     if (error) { 
     console.log("error with hash \n"); 
     return next(error); 
     } 
     user.password = hash; 
     // Here are we done with the bcrypt stuff, so it's time to call `next` 
     next(); 
    }); 
    }); 
}); 
Verwandte Themen