Javascript connection.query()外部的变量不会得到更新

Javascript connection.query()外部的变量不会得到更新,javascript,node.js,node-mysql,Javascript,Node.js,Node Mysql,我有一个登录代码,它将数据(由用户输入)发送到mysql数据库,匹配密码,并根据验证的成功或失败返回状态。为此,我定义了一个函数。状态变量在函数中声明,并通过几个验证密码的if语句进行更新。但是,当调用函数时,它总是返回状态的默认值 代码如下: var con = mysql.createConnection({ host: "localhost", user: "XXXXXX", password: "XXXXXX", database: "XXXXXX" }); con.connec

我有一个登录代码,它将数据(由用户输入)发送到mysql数据库,匹配密码,并根据验证的成功或失败返回状态。为此,我定义了一个函数。状态变量在函数中声明,并通过几个验证密码的if语句进行更新。但是,当调用函数时,它总是返回状态的默认值

代码如下:

var con = mysql.createConnection({
 host: "localhost",
 user: "XXXXXX",
 password: "XXXXXX",
 database: "XXXXXX"
});
con.connect(function(err){
    if(err) throw err;
});

function confirm(uname,pass){
    var query = "select * from clients where name='"+uname+"' ";
    var stat = 0;
        con.query(query,function(err,result){
            if(err) throw err;
            if(result.length<1){
                stat=4;
            }   
            var password = result[0].password;
            if(password === pass){
                console.log('verified');
                stat=1;
            }
            if(password!=pass){
                stat=2;

            }
        });
    return stat;
}

var con=mysql.createConnection({
主机:“本地主机”,
用户:“XXXXXX”,
密码:“XXXXXX”,
数据库:“XXXXXX”
});
con.connect(功能(错误){
如果(错误)抛出错误;
});
功能确认(取消、通过){
var query=“从name=”+uname+“”的客户机中选择*;
var-stat=0;
con.query(查询、函数(错误、结果){
如果(错误)抛出错误;

如果(result.length,那是因为您的return语句在回调之外。请尝试以下操作:

var con = mysql.createConnection({
 host: "localhost",
 user: "XXXXXX",
 password: "XXXXXX",
 database: "XXXXXX"
});
con.connect(function(err){
    if(err) throw err;
});

function confirm(uname,pass){
  return new Promise((resolve, reject) => {
    var query = "select * from clients where name='"+uname+"' ";
    var stat = 0;
    con.query(query,function(err,result){
      if(err) throw err;
      if(result.length<1){
        stat=4;
      }   
      var password = result[0].password;
      if(password === pass){
        console.log('verified');
        stat=1;
      }
      if(password!=pass){
        stat=2;
      }
        resolve(stat);
    });   
  });
}
var con=mysql.createConnection({
主机:“本地主机”,
用户:“XXXXXX”,
密码:“XXXXXX”,
数据库:“XXXXXX”
});
con.connect(功能(错误){
如果(错误)抛出错误;
});
功能确认(取消、通过){
返回新承诺((解决、拒绝)=>{
var query=“从name=”+uname+“”的客户机中选择*;
var-stat=0;
con.query(查询、函数(错误、结果){
如果(错误)抛出错误;
if(result.length{如何处理stat});

异步语法:
let stat=wait confirm('yourusername','yourpassword');

查询将异步执行。因此,如果执行该函数,在执行
con.query(…)
回调之前,将返回stat。因此,stat始终为0

function confirm(uname, pass){
    var query = "select * from clients where name='"+uname+"' ";
    var stat = 0;
        con.query(query, function(err, result){
            // This is executed delayed. return is already called.
            if(err) throw err;
            if(result.length<1){
                stat=4;
            }   
            var password = result[0].password;
            if(password === pass){
                console.log('verified');
                stat=1;
            }
            if(password != pass){
                stat=2;

            }
        });
    return stat;
}

功能确认(取消、通过){
var query=“从name=”+uname+“”的客户机中选择*;
var-stat=0;
con.query(查询、函数(错误、结果){
//此操作被延迟执行。已调用return。
如果(错误)抛出错误;

如果(result.length)不起作用,当
return
语句放入callbackEditted以返回承诺时,它将返回
undefined
,请立即尝试。请阅读。
function confirm(uname, pass, cb){
    var query = "select * from clients where name='"+uname+"' ";
    var stat = 0;
        con.query(query, function(err, result){
            if(err) return cb(err);
            if(result.length < 1){
                stat=4;
            }   
            var password = result[0].password;
            if(password === pass){
                console.log('verified');
                stat=1;
            }
            if(password != pass){
                stat=2;
            } 
            cb(null, stat);
        });
}
confirm("<username>", "<pw>", function(error, stat) {
    if (error) 
    {
          // do error routine
    } else {
         // all fine, stat is set, no error thrown
    }
}