connection.query() 之外的变量不会更新
Variables outside connection.query() donot get updated
我有一个登录代码,它将数据(用户输入)发送到 mysql 数据库,匹配密码和 returns 基于验证成功或失败的状态。为此,我定义了一个函数。状态变量在函数内部声明,并通过一些验证密码的 if 语句更新。但是,当函数被调用时,它总是returns状态的默认值
这是代码:
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;
}
问题是 console.log('verified')
在满足条件时执行。但是当这个函数被调用时它总是 returns 0
如何让它更新 stat
变量?
那是因为您的 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);
});
});
}
然后,当您调用该函数时,您需要使用 Promise/Async 语法。
承诺语法:
confirm('yourusername', 'yourpassword').then(stat => {what to do with stat});
异步语法:
let stat = await 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;
}
要解决此问题,您必须自己使用回调:
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
}
}
我有一个登录代码,它将数据(用户输入)发送到 mysql 数据库,匹配密码和 returns 基于验证成功或失败的状态。为此,我定义了一个函数。状态变量在函数内部声明,并通过一些验证密码的 if 语句更新。但是,当函数被调用时,它总是returns状态的默认值
这是代码:
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;
}
问题是 console.log('verified')
在满足条件时执行。但是当这个函数被调用时它总是 returns 0
如何让它更新 stat
变量?
那是因为您的 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);
});
});
}
然后,当您调用该函数时,您需要使用 Promise/Async 语法。
承诺语法:
confirm('yourusername', 'yourpassword').then(stat => {what to do with stat});
异步语法:
let stat = await 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;
}
要解决此问题,您必须自己使用回调:
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
}
}