2016-07-11 10 views
0

Hallo ich bin neu zu Node ich versuche, Anmeldefunktion zu erstellen ... es überprüft, ob Benutzername existiert oder nicht und andere wenige Validierungen .. aber es ist nicht warten auf Ergebnisse aus mongodb zu überprüfen, ob Benutzer vorhanden ist oder nicht .. Rückruf wird sehr early..pls Hilfe gefeuert, wie kann ich es machen wie ichCallback wird gefeuert, ohne zu warten Knoten js

var fs = require('fs'); 
 
var bcrypt = require('bcrypt-nodejs'); 
 
var util = require('./util'); 
 
exports.loginValidate = function(user, callback) { 
 
    var User = require("../Models/UserSchema").model('User'); 
 
    User.findOne({ 
 
     uname: user 
 
    }, function(err, userData) { 
 
     if (err) console.log(err); 
 
     callback(userData); 
 
    }); 
 

 

 

 
} 
 
exports.createUser = function(data, callback) { 
 

 
    var User = require("../Models/UserSchema").model("User"); 
 
    var user = new User(data); 
 
    user.save(function(error) { 
 
     if (error) { 
 

 
      return res.json({ 
 
       msg: "error" 
 
      }); 
 
     } else { 
 

 
      callback(true); 
 
     } 
 

 

 
    }); 
 

 
} 
 
exports.registerValidate = function(data, callback) { 
 
    var isValid = true; 
 
    var userData = []; 
 
    var errors = []; 
 
    for (var key in data) { 
 
     userData.push(data[key]); 
 
    } 
 
    var nam = Object.keys(data); 
 

 
    this.loginValidate(userData[0], function(data) { 
 
     //should wait for results 
 
     if (data) { 
 
      isValid = false; 
 
     } 
 
    }); 
 
    
 
    util.validateMobile(userData[2], function(bool) { 
 
     if (!bool) 
 
      isValid = false; 
 
    }); 
 
    if (util.validateEmail()) { 
 
     isValid = false; 
 
    } 
 
    //gets fired without waiting 
 
    callback(isValid); 
 

 
}
wollen

+0

können Sie den vollständigen Code teilen, wo die Funktionen werden angerufen. – shikhar

Antwort

1

Dies ist ein weiterer Fall nicht zu verstehen wie Callbacks und asynchrone Routinen in JavaScript funktionieren. Funktionen tun nicht warten auf den Abschluss einer asynchronen Funktion. Vielleicht möchten Sie darüber lesen, bevor Sie fortfahren. Hier sind ein paar ähnliche Fragen:

um Ihr Problem zu lösen, asynchrone Aufrufe loginValidate, validateMobile und callback müssen in ihren jeweiligen Callback-Funktionen verkettet werden . Hier ist, wie ich es tun würde (beachten Sie, dass dieser Ansatz fehler schnell ist und nicht mehr Validierungsschritte auslösen, sobald wir wissen, dass der Benutzer ungültig ist):

exports.registerValidate = function(data, callback) { 
    var isValid = true; 
    var userData = []; 
    var errors = []; 
    for (var key in data) { 
     userData.push(data[key]); 
    } 
    var nam = Object.keys(data); 

    this.loginValidate(userData[0], function(data) { 
     if (data) { 
     callback(false); 
     return; 
     } 

     util.validateMobile(userData[2], function(bool) { 
     callback(bool && !util.validateEmail()); 
     }); 
    }); 
}