2015-05-24 3 views
3

Ive играл с 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

Просто отметив, что [process.env.MONGOLAB_URI] определен в пространстве среды mongolabs. Вы обычно используете это против некоторого «url». –

ответ

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

Самый чистый ответ с очень подходящими комментариями из многих ответов SO, которые я прошел. Благодарю. – bozzmob

0

Возможно, вам придется добавить пустой объект JSON внутри поиска.

collection.find({}) 

Документация может быть найдена here.

+0

, что не работает –

+0

Что вы видите в консоли: console.log («Array:», collection.find(). ToArray()) – mjuopperi

+0

обратный вызов является обязательным –

Смежные вопросы