2015-05-24 231 views
3

我一直用MongoDB的玩弄在node.js中我用一些數據做了一個基本的收集(我知道它有檢查)。當我嘗試在集合上運行find()時,它返回undefined。我不知道這是爲什麼。代碼如下:MongoDB的find()方法返回undefined(node.js的)

function get_accounts(){ 
    var MongoClient = mongodb.MongoClient; 
    var url = "url"; 

    MongoClient.connect(url, function (err, db) { 
     if (err) { 
     console.log('Unable to connect to the mongoDB server. Error:', err); 
     } else { 
     //HURRAY!! We are connected. :) 
     console.log('Connection established to database'); 
     var collection = db.collection('accounts'); 
     collection.find().toArray(function(err, docs) { 
      console.log("Printing docs from Array") 
      docs.forEach(function(doc) { 
      console.log("Doc from Array "); 
      console.dir(doc); 
      }); 
     }); 
     console.log("mission complete"); 
     } 
     db.close(); 
    } 
); 
} 

如果你知道爲什麼發生這種情況,我想聽聽你的想法。謝謝!如果數據庫有任何區別,那麼該數據庫就是一個由mongolab託管的數據庫

+0

你是怎麼調用'get_accounts()'函數的? – chridam

+0

只是注意到在[mongolabs]環境空間中定義了[process.env.MONGOLAB_URI]。你通常會使用這個對比一些「網址」。 –

回答

4

你在你的代碼變得因爲Node.js的異步性質不明確的值,無處存在,告訴的console.log語句要等到find()語句完成它打印出的文件之前的邏輯。你必須瞭解的callbacks在Node.js的概念這裏有一些問題,但是,你可以修復。很多人開始使用節點有傾向巢大量的匿名功能,創造了可怕的「末日金字塔」或callback hell。通過分解一些函數並命名它們,你可以使它更清晰和更容易遵循:

var MongoClient = require("mongodb").MongoClient 

// move connecting to mongo logic into a function to avoid the "pyramid of doom" 
function getConnection(cb) { 
    MongoClient.connect("your-mongo-url", function(err, db) { 
     if (err) return cb(err); 
     var accounts = db.collection("accounts"); 
     cb(null, accounts); 
    }) 
}  
// list all of the documents by passing an empty selector. 
// This returns a 'cursor' which allows you to walk through the documents 
function readAll(collection, cb) { 
    collection.find({}, cb); 
} 

function printAccount(account) { 
    // make sure you found your account! 
    if (!account) { 
     console.log("Couldn't find the account you asked for!"); 
    } 
    console.log("Account from Array "+ account); 
} 

// the each method allows you to walk through the result set, 
// notice the callback, as every time the callback 
// is called, there is another chance of an error 
function printAccounts(accounts, cb) { 
    accounts.each(function(err, account) { 
     if (err) return cb(err); 
     printAccount(account); 
    }); 
} 

function get_accounts(cb) { 
    getConnection(function(err, collection) { 
     if (err) return cb(err);  
     // need to make sure to close the database, otherwise the process 
     // won't stop 
     function processAccounts(err, accounts) { 
      if (err) return cb(err); 
      // the callback to each is called for every result, 
      // once it returns a null, you know 
      // the result set is done 
      accounts.each(function(err, account) { 
       if (err) return cb(err) 
       if (hero) { 
        printAccount(account); 
       } else { 
        collection.db.close(); 
        cb(); 
       } 
      }) 
     } 
     readAll(collection, processAccounts);   
    }) 
} 

// Call the get_accounts function 
get_accounts(function(err) { 
    if (err) { 
     console.log("had an error!", err); 
     process.exit(1); 
    } 
}); 
+1

最清晰的答案是非常恰當的評論,因爲我經歷了很多這樣的答案。謝謝。 – bozzmob

0

您可能需要添加在裏面找一個空的JSON對象。

collection.find({}) 

可以找到文檔here

+0

沒有工作 –

+0

你怎麼在這個控制檯中看到:執行console.log(「陣列」,collection.find()指定者()) – mjuopperi

+0

回調是強制性 –