2017-12-20 2 views
-1

私は現在、postgresqlから別の関数を呼び出す関数でユーザー名とパスワードを検証しようとしています。私の検証はvalidate関数でtrueを返しますが、そうではありません。上記のconsole.logが機能し、私が実際にvalidate()を使用するときに使用するパラメータはtrueを返しますが、そうではありません。postgresqlプールからbooleanを返す

function validate(username, password){ 
//PG Connect 
pool.connect((err, client, done)=>{ 
    if(err){ 
     return console.error('error fetching client from pool', err); 
    } 
    client.query('SELECT * FROM users', (err, result)=>{ 
     if(err){ 
      return console.error('error running query', err); 
     } 


     for(let i = 0; i < result.rows.length; i++){ 
      if(result.rows[i].username.trim() == username && result.rows[i].password.trim() == password){ 
       console.log("this works"); 
       return true; //this doesn't return true when I call the function 
      } 
      console.log(result.rows[i].username.trim() + " " + result.rows[i].password.trim()); 
     } 
     return false; 
     done(); 

    }); 
}); 

}

+0

データベースからすべてのユーザーレコードを要求することにより、ユーザーを検証することはありません。これは私がまだ見た最悪の解決策です。ユーザーの詳細をパラメータとしてクエリに渡すことになっています。 –

答えて

0

問題は、クエリのコールバックの代わりに、親関数内の復帰していることです。つまり、validate()は実際に何も返されません。

この簡単な解決策は、検証時にPromiseまたはコールバックを使用することです。ここでは、

function validate(username, password) { 
    return new Promise((resolve, reject) => 
     pool.connect((err, client, done) => { 
      if (err) { 
       return reject(err); 
      } 

      client.query('', (err, results) => { 
       done(); 

       if (err) { 
        return reject(err); 
       } 

       // logic here 

       resolve(false); // failed validation 
      }); 
     }); 
    }); 
} 

約束メソッドを実装することができ...そして、あなたは...ので、同じようにそれを使用する方法で、すべてのreject()呼び出しがcatchに巻き込まれ

validate('username', 'password') 
    .then(valid => console.log(valid)) 
    .catch(err => console.error(err)); 

とすべてのresolve()コールはthenにキャッチされます。

関連する問題