0
var checkAcount = (usr, pass) => { 
    var sql = "SELECT * FROM account WHERE userName = '" +usr+"'" ;
    con.query(sql, (err, result) => {
      if(err) throw err;
      if(result.length > 0){
        bcrypt.compare(pass, result[0].password, function(err, result1) {
          if(result1 == true){
            return true;
          }
          else{
            return false;
          }
      });
      }
      else {
        return false;
      }
    });
   return ???;
}

I have code like this and I don't know how to make this function return the value of the compare function (true or false). Add return in child function like I did seem not to work. Can somebody help me please.

wangdev87
  • 8,611
  • 3
  • 8
  • 31
anoano
  • 13
  • 1
  • 3
    Does this answer your question? [How do I return the response from an asynchronous call?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – James Hyde Nov 20 '20 at 08:14

2 Answers2

1

You could return a promise:

async function checkAcount(usr, pass) => { 
    const sql = "SELECT * FROM account WHERE userName = ?" ;
    return new Promise((resolve, reject) => {
        con.query(sql, [usr], (err, result) => {
            if(err) {
                reject(err);
                throw err;
            }
            if(result.length > 0){
                bcrypt.compare(pass, result[0].password, function(err, result1) {
                    if(result1 == true){
                        resolve(result);
                        return true;
                    } else{
                        reject(err);
                        return false;
                    }
                });
            } else {
                reject(err);
                return false;
            }
       });
   });
}

Don't build your SQL query with string concatenation. That allows SQL injection.

Thomas Sablik
  • 16,127
  • 7
  • 34
  • 62
  • i try this before and it still not work. the warning said "Promise { }" – anoano Nov 20 '20 at 08:35
  • @anoano Please provide a [mcve]. The problem is probably somewhere else in your code. – Thomas Sablik Nov 20 '20 at 08:35
  • i don't know how to write exam. – anoano Nov 20 '20 at 08:44
  • checkAcount(username, password).then((result)=>console.log(result)); -- well the result is true, but the thing i want is checkAcount(username, password) = true. – anoano Nov 20 '20 at 08:45
  • You can't because `con.query` and `bcrypt.compare` are asynchronous functions. You have to work with promises. – Thomas Sablik Nov 20 '20 at 08:48
  • so i use passport to authentic. Passport.use(new LocalStrategy( (username, password, done) => { if(checkAcount(username, password)){ let userRecord = { usr: username, pass: password }; return done(null, userRecord); }else{ return done(null, false); } } )) like this. how can i change it to right? – anoano Nov 20 '20 at 08:56
  • @anoano Nearly all libraries nowadays use asynchronous functions. The SQL query is also asynchronous. `fs.readFile` is asynchronous. `db.find` is asynchronous. You can't avoid promises in this context. – Thomas Sablik Nov 20 '20 at 08:58
  • so i use passport to authentic. Passport.use(new LocalStrategy( (username, password, done) => { if(checkAcount(username, password)){ let userRecord = { usr: username, pass: password }; return done(null, userRecord); }else{ return done(null, false); } } )) like this. how can i change it to right? – – anoano Nov 20 '20 at 09:05
  • @anoano That's unrelated to this question. Please create a new question for this topic. – Thomas Sablik Nov 20 '20 at 09:05
  • i don't try avoid promises. just don't know how. i mus check account then use passport to return function done() – anoano Nov 20 '20 at 09:06
  • @anoano Yes, and this is a complete new question. You shouldn't change your question in a way that invalidates valid answers. – Thomas Sablik Nov 20 '20 at 09:27
-1

bcrypt returns a promise https://www.npmjs.com/package/bcrypt#with-promises

bcrypt.compare(pass, result[0].password).then((result) => {
  return result;
})
F.H.
  • 1,456
  • 1
  • 20
  • 34