2017-07-27 2 views
0

こんにちはすべて私はExpressを使用して基本nodesjsサーバーを作成しました。 ユーザが送信されたログインページがあり、Sqlite3 DBからのエントリをチェックします。 クエリがコールバック関数であるのは、その親関数が完了した後にのみ機能します。 しかし、以下の場合、Dbからのdb.eachコマンドには時間がかかるため、コールバック関数は必要な出力を与えません。しかし、タイムアウト機能を設定すると適切な答えが得られます。Javascriptコールバック

コードuserloginのページが呼び出され /*ポスト要求を切り取ら*/

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

おそらく、これらの呼び出しを相互に連結する必要があります。コールバックを使用したJavascript非同期呼び出しについて読んでください。約束についても読むのは興味深いでしょう:-) – flob

答えて

0

あなたはdb.each関数のコールバックでコールバックを配置する必要があり、そうあなたがからデータを得た後にそれが実行されますあなたのデータベース:

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

コールバックはそれを解決する一つの方法ですが、グローバル変数( 'userLoginStatus')を使用して値を渡すべきではなく、コールバックの第2引数として渡すべきです。 –

+0

@ t.nieseは質問の一部ではなかったし、彼はグローバル変数がどこか別の場所に必要かもしれない。 – Danmoreng

+0

Danmorengありがとう、それは私のために働いた。コールバックの配置には注意が必要でした。 –

関連する問題