2016-07-05 34 views
1

私はただ一度使っても、私の関数の中の1つが複数回呼び出されていることに気付きました。機能はcreateWalletです。それを呼び出した後、私はそのユーザーIDを持つ2-5個の財布を持つデータベースになります。Node.jsで関数が複数回呼び出されます

アイデアはちょうど彼のアカウントを有効に利用者のためのただ一つ、 "財布" を作成することで、ここにコードがある:

ルート

app.get('/api/activateAccount', function(req, res){ 
     var mail = req.query.mail; 
     var db = require('../controllers/loginController'); 
     db.activateAccount(mail, function(result){ 
      res.json(result); 
     }); 
}); 

LoginController

exports.activateAccount = function(mail, callback){ 

pool.getConnection(function(err, connection){ 
    if(err){ 
    console.log(err); 
    callback(true); 
    return; 
    } 

    connection.query("UPDATE usuarios SET activo = 1 WHERE correo = ?", [mail], function(err, results) { 
     result = results; 

     if(err){ 
     console.log(err); 
     } 

     connection.query("SELECT id_usuario AS id FROM usuarios WHERE correo = ?", [mail], function(err, results) { 
     result = results; 

     if(err){ 
      console.log(err); 
     } 
     connection.release(); 

     createWallet(result[0].id); //this is the only place i call createWallet 

     callback("Thank you for confirming your mail you can now Log In with your account."); 

     }); 
    }); 
    }); 
}; 

の機能activateAccountそして最後にウォレットを作成する

function createWallet(id_usuario){ 
var new_wallet = { 
    id_usuario: id_usuario, 
    coins: 0 
}; 

var string = "NULL"; 
pool.getConnection(function(err, connection){ 
    if(err){ 
    console.log(err); 
    callback(true); 
    return; 
    } 

    connection.query('INSERT INTO usuarios_citypoints SET ?', new_wallet, function(err, results){ 
     connection.release(); 
     if(err) { 
     console.log(err); 
     callback(true); 
     return; 
     } 

     return; 
    }); 
    }); 
}; 

なぜこれが起こりますか?

+2

あなたは、ユーザーが既に起動された場合に有効かどうか、そのURLを呼び出していません複数回も複数のウォレットが作成されます。 – Shaharyar

+1

私は何か間違って見ることができません。もしあなたがそれを使っていれば、ChromeはURLを先読みしているので、二度ヒットするかもしれません。別のブラウザを使用するか、curlを使用してそのURLにアクセスしてみてください。 – Adam

+2

ルートやコントローラではなく、複数回呼び出されるのは特にその機能であることを確認しましたか? – JJJ

答えて

0

私はまた、あなたの複数wallet作成問題を解決する、アイデアを与えるためにビットをあなたのコードを変更した:

exports.activateAccount = function(mail, callback){ 

pool.getConnection(function(err, connection){ 
    if(err){ 
    console.log(err); 
    callback(true); 
    return; 
    } 

    connection.query("SELECT id_usuario AS id FROM usuarios WHERE activo = 0 AND correo = ?", [mail], function(err, user) { 
    //connection.query("UPDATE usuarios SET activo = 1 WHERE correo = ?", [mail], function(err, results) { 

     if(err){ //check error 
     console.log(err); 
     } 
     else if(user == null) { //if user not exists 
     callback("user not found"); 
     } 
     else if(user[0].activo == 1) { //if already activated 
     callback("already activated"); 
     } 

     connection.query("UPDATE usuarios SET activo = 1 WHERE correo = ?", [mail], function(err, user_activated) { 

     if(err){ 
      console.log(err); 
     } 
     else if(user_activated.changedRows == 0) { //if no row was updated 
      callback("unknown error while updating"); 
     } 
     connection.release(); 

     createWallet(user[0].id); //this is the only place i call createWallet 

     callback("Thank you for confirming your mail you can now Log In with your account."); 

     }); 
    }); 
    }); 
}; 
関連する問題