2017-07-27 7 views
0

Hallo all Ich habe einen grundlegenden Nodesjs Server mit Express erstellt. Es gibt eine Login-Seite, auf der ein Benutzer gesendet wird, es prüft den Eintrag von der Sqlite3 DB. Meine Abfrage ist Callback-Funktion funktioniert nur, nachdem seine übergeordnete Funktion erledigt ist. Im folgenden Fall jedoch, da der Befehl db.each vom Db einige Zeit benötigt, gibt die Callback-Funktion nicht die gewünschte Ausgabe. Aber wenn ich eine Timeout-Funktion einstelle, gibt es eine passende Antwort.Javascript Rückruf

-Code snipped /* post request Userlogin Seite aufgerufen */

app.post('/userLogin',function(req,res){ 
    checkLogin(req,function(){//using a callback 
    setTimeout(function(){//delaying the execution of this part** 
    if(userLoginStatus=='SUCCESS'){res.render('userLogin');} 
    else{res.send('Wrong credentials');} 
    },100); 
    }); 
}); 


function checkLogin(req,callback){ 
    db.serialize(function(){ 
    db.each("SELECT * from USERLOGIN where USERID ='"+req.body.userId+"'"+ 
    " AND PASSWORD='"+req.body.password+"'",function(err,row){ 
    if(row.USERID.length>0){userLoginStatus ='SUCCESS';} 
    else {userLoginStatus = 'UNSUCCESFUL';} 
    }); 
    }); 
    callback(); 
} 
+0

Wahrscheinlich werden Sie diese Anrufe ineinander verketten müssen. Sie sollten über asynchrone Javascript-Aufrufe mit Rückrufen lesen. Es wird interessant sein, auch über Versprechungen zu lesen :-) – flob

Antwort

0

Sie benötigen Rückruf in den Rückruf der db.each Funktion zu setzen, so dass es läuft, nachdem Sie die Daten bekam von Ihrem Datenbank:

function checkLogin(req, callback) { 
    db.serialize(function() { 
     db.each("SELECT * from USERLOGIN where USERID ='" + req.body.userId + "'" + 
      " AND PASSWORD='" + req.body.password + "'", 
      // This is the db.each callback function 
      function (err, row) { 
       if (row.USERID.length > 0) { 
        userLoginStatus = 'SUCCESS'; 
       } 
       else { 
        userLoginStatus = 'UNSUCCESFUL'; 
       } 
       // you need to call your callback INSIDE of the db.each callback 
       callback(); 
      }); 
     // Placing it here is wrong, because it will be executed before db.each is completed 
     // callback(); 
    }); 
} 
+0

Es ist wahr, dass ein Callback eine Möglichkeit ist, es zu lösen, aber der Wert sollte nicht mit einer globalen Variable ('userLoginStatus') übergeben werden, sondern als zweites Argument des Callbacks . –

+0

@ t.niese das war nicht Teil der Frage, und er könnte die globale Variable woanders brauchen. – Danmoreng

+0

Danke Danmoreng, es hat für mich funktioniert. Hätte mit der Platzierung des Rückrufs vorsichtig sein sollen. –