0

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

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

4

1 回答 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上面的等)。您还需要注意,在调用这些情况中的任何一种之前,都会经过一段时间,具体取决于连接。

于 2013-02-27T19:03:46.917 回答