2013-02-27 59 views
0

一个嵌套函数我使用一个函数来检查用户是否已经注册的网站上。 但我无法弄清楚如何获得的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; 
    } 
} 

我听说我应该使用回调,但我无法弄清楚如何得到这个工作。

回答

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等)。您还需要注意,在调用这两种情况之前,将根据连接情况经过一段时间。