2013-06-12 168 views
0

我繼承了一些node.js代碼,我不知道它是如何工作的。我遇到的問題是打開數據庫連接,而不是關閉或重複使用它們。所以在某些時候,我不得不殺死節點進程來釋放連接,否則數據庫就會開始抱怨。我試圖自己關閉連接,但不能理解基於事件的邏輯,因爲在第二個查詢可以運行或者根本不運行之前,我最終會關閉連接。我在Ubuntu 12.04.2 LTS上使用節點0.6.12,節點mysql模塊爲v0.9.6。以下是一個示例模型方法。Node.js關閉數據庫連接

this.search = function(options, callback) { 
    if (options.post) { 
     var query; 
     var param; 
     var limit; 
     var results_per_page = 10; 
     var page = (options.post.hasOwnProperty('page') && parseInt(options.post.page)) ? options.post.page : 1; 

     limit = ' LIMIT ' + ((page-1)*(results_per_page)) + ',' + results_per_page; 
     if (options.post.term) { 
       var escaped_term = options.database_client.escape('%' + options.post.term + '%'); 
       query = "Q" + limit; 
     } else { 
       query = "Q" + limit; 

     } 
     options.database_client.query(query, [], query_results); 
     // Tried closing DB connection here 
     function query_results(err, results, fields) { 
      var all_results = {}; 
      all_results.total_results = 0; 
      all_results.total_pages = 0; 
      all_results.current_page = page; 
      all_results.results = []; 

      if (err) { 
       console.log('You have an error: ' + err); 
       throw err; 
      } else { 
       if(!results[0]) { 
        callback(undefined, all_results); 
        return; 
       } else{ 
        options.database_client.query("SELECT found_rows() AS total", [], function(err, results2, fields) { 
         if (err) { 
          console.log('You have an error: ' + err); 
          throw err; 
         } else { 
          if (!results2[0]) { 
           callback(undefined, all_results); 
           return; 
          } else { 
           var all_results = {}; 
           all_results.total_results = results2[0].total; 
           all_results.total_pages = Math.ceil(all_results.total_results/results_per_page); 
           all_results.current_page = page; 

           for(var property in results) { 
            if(results.hasOwnProperty(property)){ 
             if(results[property] == "" || results[property] == " "){ 
              results[property] = null; 
             } 
            } 
           } 
           all_results.results = results; 

          } 
          callback(undefined, all_results); 
          return; 
         } 

        }); // end query 
       } 
      } 
      // I think here is only closing one connection 
      options.database_client.end(); 
     } 
    // Also tried here but total_pages, total_results end up being 0 in the results callback 
    } 
}; 

我使用options.database_client.end();收每Node.js的mysql的模塊,文檔數據庫連接。任何幫助將不勝感激。

回答

0

實際上您正在使用anoymous功能 3月底的數據庫連接

這樣 1.查詢和呼叫query_results,當結果準備就緒 2.再次查詢(發現行),但是,那裏有一個問題在於:結束被稱爲,在不久之前。函數爲found_rows結果,我想。

我認爲你必須在代碼中,這應該叫options.database_client.end()幾個百分點 1拋出一個錯誤(2處) 2之間時,「回調(未定義,all_results);」和「返回」 (2地方太)

或更好:關閉數據庫,在第一行回調後從外部調用這個方法甚至更好:在外部請求結束時