2017-12-20 4 views
-1

Ich versuche derzeit, Benutzername und Kennwort in einer Funktion zu validieren, die eine andere Funktion von Postgresql aufruft. Meine Validierung sollte in der Validierungsfunktion den Wert "true" zurückgeben, tut dies jedoch nicht. Das console.log darüber funktioniert und die Parameter, die ich benutze, wenn ich validate() benutze, sollten wahr zurückgeben, sind es aber nicht.Boolean aus PostgreSQL-Pool zurückgeben

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

Sie validieren niemals einen Benutzer, indem Sie alle Benutzerdatensätze aus der Datenbank anfordern. Das ist die schlechteste Lösung, die ich bisher gesehen habe. Sie sollen Benutzerdetails als Parameter an die Abfrage übergeben. –

Antwort

0

Das Problem ist, dass Sie innerhalb der Abfrage Rückruf sind Rückkehr statt der übergeordneten Funktion. Das bedeutet, dass tatsächlich nichts zurückgibt.

Eine einfache Lösung wäre, entweder eine Promise oder einen Callback bei der Validierung zu verwenden. Hier ist, wie Sie das Versprechen Methode implementieren könnte ...

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 
      }); 
     }); 
    }); 
} 

Und Sie würden es wie so verwenden ...

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

Wo alle reject() Anrufe sind gefangen in der catch und alle resolve() Anrufe werden in then gefangen.

Verwandte Themen