获得一个变量出的Node.js
问题描述:
一个嵌套函数我使用一个函数来检查用户是否已经注册的网站上。 但我无法弄清楚如何获得的rows
值该功能的selectEmail()
获得一个变量出的Node.js
我试图将其存储内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;
}
}
我听说我应该使用回调,但我无法弄清楚如何得到这个工作。
答
我猜测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
等)。您还需要注意,在调用这两种情况之前,将根据连接情况经过一段时间。