2017-12-06 1 views
-1

In diesem Code sollten Variablen adminName und adminPassword Werte vor der Ausführung von if-Anweisungen abrufen. Aber wenn Anweisungen vor der then-Handler-Funktion ausgeführt werden. Deshalb funktioniert die Validierung nicht.Nodejs: Warten, bis ein Versprechen aufgelöst wird

function validateAdminLogin() 
{ 

var adminName=""; 
var adminPassword=""; 

var isValid=true; 

var UserDAO = require('./js/DAO/UserDAO'); 
var wait=require('wait.for-es6'); 
var admin=document.getElementById("adminform").elements.namedItem("username").value; 
var adminPwd=document.getElementById("adminform").elements.namedItem("pwd").value; 




    UserDAO.getAdminCredentials().then(function(rows){ 

    adminName= rows.username; 
    adminPassword=rows.password; 

    alert(admin+"----"+adminName); 

    },function(error){ 
    alert(error); 
    console.log(error); 
    }); 



    //alert(admin+"-------"+adminName); 

if(admin!==adminName) 
{ 
alert("Invalid username"); 
isValid=false; 
} 


if(adminPwd!==adminPassword) 
{ 
alert("Invalid password"); 
isValid=false; 
} 

return isValid; 
} 

Ich schließe auch den Code, in dem ich das Versprechen geschrieben habe.

getAdminCredentials: function() 
{ 
    var deferred = q.defer(); 

    $query = "SELECT * FROM `user` where type='administrator' "; 

    connection.connect(function(err) { 

     if(err){ 
      console.log(err.code); 
      console.log(err.fatal); 
     } 

    // console.log("Successfully connected."); 
    }); 

    connection.query($query, function(err, rows, fields) { 
     if(err){ 
      console.log("An error ocurred performing the query."); 
      console.log(err); 
      deferred.reject(err); 
      return; 
     } 
     else 
      { 
      console.log("Query succesfully executed"); 
      userDTO.setUserId(rows[0].user_id); 
      userDTO.setUsername(rows[0].username); 
      userDTO.setPassword(rows[0].password); 

      deferred.resolve(userDTO); 

      } 



    }); 


    return deferred.promise; 

    connection.end(); 
} 

Wie gehe ich mit dieser asynchronen Natur von nodejs um? Bitte helfen Sie.

Antwort

0

Sie müssen einfach Ihre if-Anweisung innerhalb der then() -Anweisung setzen.

Alles, was die Anmeldeinformationen benötigt, sollte in der dann oder in anderen folgenden dann(). Zum Beispiel könnte zurückkehren Sie Ihr Versprechen:

return UserDAO.getAdminCredentials().then(function(rows){ ... 

und wenn Ihre Funktion hinzufügen, eine dann(), um sie aufzurufen:

validateAdminLogin().then(...) 
0

Sie Ihre validateAdminLogin Funktion wie folgt umschreiben könnte:

function validateAdminLogin() { 
    var UserDAO = require('./js/DAO/UserDAO'); 
    var wait = require('wait.for-es6'); 
    var admin = document.getElementById("adminform").elements.namedItem("username").value; 
    var adminPwd = document.getElementById("adminform").elements.namedItem("pwd").value; 

    // return a promise which will be resolved with a bool indicating the "valid" status 
    // the promise can reject when there was an error 
    return UserDAO.getAdminCredentials().then(function(rows) { 
     var adminName = rows.username; 
     var adminPassword = rows.password; 

     if (admin !== adminName) { 
      alert("Invalid username"); 
      return false 
     } 

     if (adminPwd !== adminPassword) { 
      alert("Invalid password"); 
      return false 
     } 

     return true 
    }, function(error) { 
     console.log(error); 
    }); 
} 

Sie müssen Ihren Funktionsaufruf etwas anders behandeln, weil es den bool nicht sofort zurückgibt. Sie sind Aufrufort würde wie folgt aussehen:

validateAdminLogin().then(function (isValid) { 
    // handle the "isValid" bool 
}, function (error) { 
    // handle the error... 
}); 

Es ist nicht möglich, eine asynchrone Aktion in node.js. zu synchronisieren

+0

Wie rufe ich "validateAdminLogin(). Dann (.......) ....." aus html. –

+0

Sie können es nicht aus HTML so nennen, aber Sie könnten einen zusätzlichen Handler hinzufügen, der das (Event) behandelt ?. Ich nehme an, dass Sie etwas wie ein HTML-Formular haben, so dass Sie dem Formular einen Ereignis-Listener hinzufügen können, um das "[submit] (https://developer.mozilla.org/en-US/docs/Web/Events/submit) zu behandeln. " Veranstaltung. – Siggy

+0

Es funktioniert nicht. Das Skript wird ausgeführt, sobald die Seite geladen wird. Und wenn ich event.preventDefault() hinzufüge, funktioniert alles gut, aber wegen preventDefault() wird das Formular nicht gesendet. –

Verwandte Themen