Javascript 从Node.js中的嵌套函数中获取变量

Javascript 从Node.js中的嵌套函数中获取变量,javascript,node.js,Javascript,Node.js,我正在使用一个函数来检查用户是否已经在站点上注册。 但是,我不知道如何从函数selectEmail() 我试图将它存储在temp中,但它似乎将它存储在它自己的本地版本中,一旦查询部分结束,我就剩下一个空变量 function checkEmail(email, req, res){ var temp; dbConnect(req,res); var query = 'SELECT EMAIL FROM USERS WHERE EMAIL="'+email+'"'; connect

我正在使用一个函数来检查用户是否已经在站点上注册。 但是,我不知道如何从函数
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;
  }
}

我听说我应该使用回调,但我也不知道如何让它工作。

我猜
连接。query
是异步的,这意味着它不会在其余代码执行之前完成。这意味着当您达到if(temp==“”){时,
temp
没有值

要处理此问题,需要使用回调。回调是在代码完成后调用的函数,在本例中为
connection.query()
。这正是本例中的功能,只是格式不太正确:

connection.query(query, function selectEmail(err,rows,fields){
    if (err) {
        throw err;
    }
    temp=rows;
})
此处的
selectEmail()
是回调,但回调应作为函数指针或匿名函数(无名称)提供:

此代码可能会在
checkEmail()
返回后发生。在
conconnect.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
等)。您还需要注意,在调用这两种情况之前,将根据连接情况经过一段时间。

我猜
连接。查询是异步的,这意味着它不会在其余代码执行之前完成。这意味着当您达到
if时,
temp
没有值(temp==“”){

要处理此问题,需要使用回调。回调是在代码完成后调用的函数,在本例中为
connection.query()
。这正是本例中的功能,只是格式不太正确:

connection.query(query, function selectEmail(err,rows,fields){
    if (err) {
        throw err;
    }
    temp=rows;
})
此处的
selectEmail()
是回调,但回调应作为函数指针或匿名函数(无名称)提供:

此代码可能会在
checkEmail()
返回后发生。在
conconnect.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
等)。您还需要注意,在调用这两种情况之前,将根据连接情况经过一段时间