2014-09-04 107 views
0

大家好,的Node.js - 連接池

只是想知道,這是正確的方法:

  • 得到連接池連接,
  • 請求發送到MySQL服務器,
  • 等待結果
  • 返回連接回連接池?

這下面的代碼是每次稱爲一個用戶登錄時,它會檢查他的用戶名和令牌,如果它是一個比賽,將打開主菜單頁面,如果沒有也將返回到登錄頁面。

的事實是,它在Chrome的所有工作,但有時它不工作在Firefox,它只是沒有在所有調用connection.query()部分..

所以我只是與你們檢查,如果一切正常的代碼below..Or如果有什麼我可以改善或改變..

var db_pool = mysql.createPool({ 
    host: 'localhost', 
    user: 'dbuser', 
    password: 'pass', 
    database: 'db_name' 
}); 

function CheckUser(username, token) 
{ 
    db_pool.getConnection(function(err, connection) 
    { 
     console.log(" [i] Getting connection from pool. "); 
     var entry = 0; 
     var query = connection.query("SELECT token FROM users where token = '"+token+"' and user_id = '"+username+"'"); 

     query.on('result', function(data){ 
      entry++; 
     }); 
     query.on('error', 
      function(err){ 
       throw(err); 
      } 
     ); 
     query.on('end', 
      function() 
      { 
       if(entry == 1) 
       { 
        console.log(" [info] User ["+username+"] authorized."); 
        /* DO STUFF */ 
       }else 
       { 
        console.log(" [Error] User ["+username+"] does not have token: ["+token+"]."); 
        return false; 
       } 
      } 
     ); 
     console.log(" [i] Returning back connection to pool. "); 
     connection.release(); 
    }); 
} 

任何幫助是極大的讚賞,

亞歷

回答

1

我相信間歇性行爲是因爲你的release()語句符合連接而不是在'end'處理程序中。這是什麼適合我:

var mysql = require('mysql'), 
    config = require('./config.json'); 

var pool = mysql.createPool(config); 

var checkUser = function(username, token) { 
    pool.getConnection(function(err, connection) { 
     if (err) throw err; 

     console.log(" [i] Getting connection from pool. "); 
     var entry = 0, 
      statement = 'SELECT token FROM users where token = ? and user_id = ?', 
      query = connection.query(statement, [ token, username ]); 

     query.on('result', function(data) { 
      console.log(data); 
      entry++; 
     }); 

     query.on('error', function(err) { 
      console.log(err); 
      throw err; 
     }); 

     query.on('end', function() { 
      if (entry === 1) { 
       console.log(" [info] User ["+username+"] authorized."); 
       /* DO STUFF */ 
      } else { 
       console.log(" [Error] User [", username, "] does not have token [', token, ']'); 
      } 

      console.log(" [i] Returning back connection to pool. "); 
      connection.release(); 
     }); 
    }); 
}; 

console.log('check the user...'); 
checkUser('test-user', 'mytoken'); 

我能夠測試這個(與替代陳述)沒有問題。我也把配置的東西放在一個單獨的文件中,並用參數替換了字符串語句。

希望這會有所幫助...

+0

它現在似乎工作得好多了。 – Wracker 2014-09-05 14:13:45