2016-05-14 47 views
0

我對node.js和mongodb很新穎。我需要一個函數,它將從數據庫返回一個包含結果的數組。當我在php中查詢'SELECT * FROM table'時,它返回數組或對象數組。但是對於節點和mongo,我必須使用很多代碼,這對我來說似乎沒有必要。所以我寫了這個函數:MongoDB + node.js - SQL選擇等效

select: function (table, terms) { 
    var rows = []; 
    var find = function (error, db) { 
     var collection = db.collection(table); 
     var docs = collection.find(terms); 
     docs.each(function (error, doc) { 
      rows.push(doc); 
     }); 
    }; 
    client.connect(url, find); 
    return rows; 
} 

它把表名[字符串]和術語[js對象]作爲參數。我想這個函數返回一個這樣的數組:[{doc1},{doc2},{doc3},...]。 當我登錄變量文檔,在每個函數中,它是好的 - 有效的JavaScript對象。但是當我推送所有文檔後記錄變量行時,它是空的 - []。另外函數select()的結果是空數組 - []。

請,有沒有誰的人有什麼可能是一個問題,或者誰使用了一些類似的方法,從MongoDB中獲取數據的想法?謝謝

+0

你仍然可以使用ORM像貓鼬。 – YOU

回答

0

connect函數是異步的,和你的return語句後結束。把你的return語句放在回調函數中,緊跟在docs.each(.....)的後面。這樣你就可以確定你的return語句將在你的數組被填充後執行。

編輯的完整性:return語句不,當然工作,因爲它在找到函數返回。使用回調函數。

像這樣:

select: function (table, terms, cb) { 
    var rows = []; 
    var find = function (error, db) { 
     var collection = db.collection(table); 
     var docs = collection.find(terms); 
     docs.each(function (error, doc) { 
      rows.push(doc); 
     }); 
     cb(error, rows); 
    }; 
    client.connect(url, find); 
} 

編輯:上面的例子(CB函數而不是返回)

+0

好吧,我試過了,但問題是,return語句現在在回調函數中,所以它在回調中返回的行不在select函數中。現在,當我調用select時,它什麼也不返回(函數沒有返回值) - undefind。我認爲這是整個javascript內的大限制,如何從回調中返回值。但是,謝謝 –

+0

是的,是俯視。但爲了克服這個問題,你可以傳遞第三個參數給select函數,這是另一個回調函數。函數(表,術語,cb)。完成後,您可以調用return cb(rows)或更好的cb(error,rows)。 – Keugels

+0

是的,這是個好主意,不幸的是我使用的項目結構使得它非常複雜。有一個訪問數據庫的模型(上面的代碼是從那裏得到的),當調用http路由時,我從特定模型調用函數,從這裏調用select函數,然後處理結果並將格式化的數據返回到路由。所以需要很多回調。但似乎我必須這樣做,充滿了回調。也許我將來會實施貓鼬或類似的東西。 –