我正在使用一个函数来检查用户是否已在网站上注册。
但是,我无法弄清楚如何从函数rows
中获取selectEmail()
的值
我正在尝试将其存储在temp
中,但它似乎将其存储在其自己的本地版本中,并且一旦查询部分结束,我就会留下一个空变量。
function checkEmail(email, req, res){
var temp;
dbConnect(req,res);
var query = 'SELECT EMAIL FROM USERS WHERE EMAIL="'+email+'"';
connection.query(query, function selectEmail(err,rows,fields){
if (err) {
throw err;
}
temp=rows;
})
dbClose(req,res);
console.log(temp);
if (temp==""){
console.log('No matching email in database');
return 0;
}
else{
console.log('Duplicate Email detected in database');
return 1;
}
}
我听说我应该使用回调,但我也无法弄清楚如何使用它。
答案 0 :(得分:3)
我猜测connection.query
是异步的,这意味着它在其余代码执行之前没有完成。这意味着当您到达temp
时,if(temp==""){
没有值。
要处理此问题,请使用回调。回调是在代码完成后调用的函数,在本例中为connection.query()
。这正是你在这种情况下所拥有的,除非格式不正确:
connection.query(query, function selectEmail(err,rows,fields){
if (err) {
throw err;
}
temp=rows;
})
这里selectEmail()
是回调,除了回调应该作为函数指针或匿名函数(没有名称)提供:
connection.query(query, function(err,rows,fields){
if (err) {
throw err;
}
temp=rows;
});
此代码可能会在checkEmail()
返回后很好地发生。在conection.query()
完成后您想要发生的任何事情应该是 回调或调用回调。像这样:
connection.query(query, function(err,rows,fields){
if (err) {
throw err;
}
dbClose(req,res);
if (rows==""){
console.log('No matching email in database');
handleEmailCheckFailure();
}
else{
console.log('Duplicate Email detected in database');
handleEmailCheckSuccess();
}
});
当然,您希望checkEmail()
根据检查是否成功返回值。这不适用于异步调用。您需要具有处理传递和失败案例的函数(handleEmailCheckFailure
等)。您还需要注意,在调用其中任何一种情况之前,根据连接需要花费一些时间。