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 に答える