NodeJS Variable aus Function bekommen?
Ich weiß gerade echt nicht wonach ich suchen soll.
var databasePassword;
bcrypt.hash(passwort, 10, function(err, hash){
if(err) {console.log("HASH ERROR");throw err;}
console.log(hash);
databasePassword = hash;
console.log("databasePassword:"+databasePassword);
});
console.log(databasePassword);
Es wird Problemlos:
console.log(hash);
console.log("databasePassword:"+databasePassword);
ausgegeben. Nur bekomme ich das ganze nicht außerhalb der Funktion ausgegeben.
Er sagt dann einfach "undefined".
Woran liegt das? Ich habe die Variable ja davor Global gesetzt. Oder nicht?
Danke im Voraus!
5 Antworten
Höchstwahrscheinlich wird die Funktion (was wohl ein Callback von bcrypt.hash ist) asynchron aufgerufen. Bedeutet, das console.log() außerhalb dieser Funktion wartet nicht darauf, dass die Variable databasePassword innerhalb der Funktion gesetzt wird, sondern wird direkt ausgeführt. Die Variable wird daher erst dann gesetzt, wenn das console.log() außerhalb der Funktion längst vorbei ist.
Ist es dringend erforderlich, dass das console.log() außerhalb des Callbacks/der Funktion steht?
Wenn du mit unübersichtlich die Einrückung meinst, die irgendwann einfach zu viel wird, kannst du natürlich deine Funktionen in eigene Funktionen auslagern. Sprich, statt
bcrypt.hash(passwort, 10, function(err, hash){
//do this
//and do that
});
Könntest du auch
bcrypt.hash(passwort, 10, dosomething(err, hash));
function dosomething(err, hash){
//do this
//and do that
}
Dadurch dürfte das Ganze wieder übersichtlicher werden. Ansonsten, es gibt für dein "Problem" einen eigenen Begriff, Callback Hell, also wortwörtlichm Callback-Hölle, womit fast jeder Javascript-Programmierer zu kämpfen hat. Hier eine recht interessante Seite dazu, wo du ggf. Ansätze für einen anderen Programmierstil bekommst: https://blog.hellojs.org/asynchronous-javascript-from-callback-hell-to-async-and-await-9b9ceb63c8e8 sowie http://callbackhell.com/
Da die Funktion ein Übergabeparameter einer anderen ist, vermute ich mal, dass diese Funktion asynchron aufgerufen wird.
Also musst du den Funktionsaufruf abwarten.
Warum muss console.log() unbedingt außerhalb der Funktion stehen?
Ich denke, wenn ich alles in die Funktion schreibe, wird es dann irgendwann unübersichtlich. So etwas muss doch möglich sein oder?
Du kannst innerhalb der Funktion weitere Funktionen aufrufen.
Es sieht so aus als wäre hash undefined, und damit auch databasePassword. Denn "undefined" ist ein Wert den man in JS zuweisen kann.
Ist denn "password" am Anfang der Funktion überhaupt gesetzt?
Hast du denn die Funktion schon einmal davor aufgerufen? Ansonsten wird die Variable ja nie belegt werden.
Du könntest mal versuchen databasePassword vor der Funktion einen Wert zuzuweisen. Ich bin in JS nicht so fit, kann aber sein das der Ort der Deklaration weniger aussagt als der Ort der ersten Initialisierung.
Ja an sich schon, weil es wird immer unübersichtlicher. Du musst dir vorstellen, ich mache eine registrier Funktion. Ich habe davor schon abgefragt, ob es die E-Mail gibt unsw. Es wird langsam unübersichtlich, wenn das jetzt auch noch da rein kommt. Wie könnte man das Problem denn lösen? Also so lange warten,