2017-12-20 5 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에 있습니다.