2014-01-20 62 views
3

我想在expressjs應用程序中使用sqlite3(nodejs)如何在函數中返回節點的sqlite3的結果?

我想創建一個函數,該函數返回select語句的所有結果。該功能將通過

var queryGetAll = 'SELECT id, title, description, modified, lat, lng, zoom FROM maps'; 
function Manager(){ 
     this.db = null; 
     this.getAll = function(){ 
      var all = []; 
      this.db.all(queryGetAll, function(err, rows){ 
       if (err){ 
        throw err; 
       } 
       all.push.apply(all, rows); 
      }); 
      return all; 
     } 
} 

我知道一個的NodeJS路線被稱爲是非同步,所以這意味着回報是查詢結束之前調用。但我沒有找到如何使用sqlite的例子。

+1

這可能_seem_不同,但它確實與[作爲Ajax的問題​​(http://stackoverflow.com/questions/14220321/how-to-return-the-a-ajax-call/16825593#16825593) - 你不從異步查詢返回 - 你傳遞迴調或使用promise。 –

回答

6

您的示例中的「return all」行將在this.db.all()調用您的回調之前執行。爲了使您的代碼工作,你需要做這樣的事情:

var queryGetAll = 'SELECT id, title, description, modified, lat, lng, zoom FROM maps'; 
function Manager(){ 
     this.db = null; 
     // Allow a callback function to be passed to getAll 
     this.getAll = function(callback){ 
      this.db.all(queryGetAll, function(err, rows){ 
       if (err){ 
        // call your callback with the error 
        callback(err); 
        return; 
       } 
       // call your callback with the data 
       callback(null, rows); 
       return; 
      }); 
     } 
} 
+2

謝謝。現在我知道我需要用回調來思考並返回結果。我正在閱讀http://callbackhell.com/ – toutpt

+0

一旦你習慣了回調的概念,代碼開始變得更有意義,並且變得自然。確實,它可以很容易地變成回撥地獄(或厄運的金字塔),就像在其他語言中一樣,人們可以用17個班級和6個工廠來過度設計他們的OO創作,以添加兩個數字:) –

+0

那麼,哪裏有結果出來了嗎? –