2015-06-05 3 views
2

При использовании .toArray(), я знаю, что вы могли бы использовать db.close() внутри обратного вызова следующим образом:Когда вы вызываете db.close() при использовании cursor.forEach()?

db.collection('grades').find(query).toArray(function(err, docs) { 
    if (err) throw err; 
    console.dir(docs); 
    db.close(); 
}); 

Но что, если вам нужно перебрать массив? Кажется чрезмерным: 1) итерация по курсору для построения массива, а затем 2) итерация по массиву для выполнения вашей работы. Поэтому я думал, что было бы неплохо использовать cursor.forEach().

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { 
    if (err) throw err; 

    var cursor = db 
       .collection('data') 
       .find({}) 
       .sort({State: 1, Temperature: -1}); 

    var prevState = ''; 
    var curr; 

    cursor.forEach(function(doc) { 
    if (doc.State === prevState) return; 

    db.collection('data').update(doc, { $set: { month_high: true}}); 
    prevState = doc.State; 
    }); 

    db.close(); 
}); 

Однако, это дает мне ошибку:

~/code/m101js $ node test.js 
/Users/azerner/code/node_modules/mongodb/lib/utils.js:97 
    process.nextTick(function() { throw err; }); 
             ^
TypeError: undefined is not a function 
    at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:527:15 
    at handleCallback (/Users/azerner/code/node_modules/mongodb/lib/utils.js:95:12) 
    at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:493:22 
    at handleCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:234:5) 
    at /Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:533:22 
    at queryCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:167:20) 
    at Callbacks.flush (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:86:7) 
    at Server.destroy (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:694:41) 
    at Server.close (/Users/azerner/code/node_modules/mongodb/lib/server.js:344:17) 
    at Db.close (/Users/azerner/code/node_modules/mongodb/lib/db.js:273:19) 
~/code/m101js $ node test.js 
/Users/azerner/code/node_modules/mongodb/lib/utils.js:97 
    process.nextTick(function() { throw err; }); 
             ^
TypeError: undefined is not a function 
    at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:527:15 
    at handleCallback (/Users/azerner/code/node_modules/mongodb/lib/utils.js:95:12) 
    at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:493:22 
    at handleCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:234:5) 
    at /Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:533:22 
    at queryCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:167:20) 
    at Callbacks.flush (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:86:7) 
    at Server.destroy (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:694:41) 
    at Server.close (/Users/azerner/code/node_modules/mongodb/lib/server.js:344:17) 
    at Db.close (/Users/azerner/code/node_modules/mongodb/lib/db.js:273:19) 
~/code/m101js $ 

Это, кажется, весь код библиотеки, и я не совсем уверен, как отлаживать его. Но похоже, что проблема заключается в db.close().

  1. Это так?
  2. Если да, то где еще я бы положил db.close()?
+0

Зачем вам это закрыть? – adeneo

+0

@adeneo Я не уверен. Я действительно принимаю [класс] (https://university.mongodb.com/courses/10gen/M101JS/2015_May/syllabus) и не совсем уверен, что я делаю. Но, если вы не закрываете это, вы никогда не захотите делать в этом сценарии, мой вопрос остается. –

+0

Вообще говоря, я думаю, что большинство приложений просто подключится один раз и не откроет соединение, нет необходимости закрывать соединение для каждого вызова в БД – adeneo

ответ

2

Вопрос заключается в том, что db.close() был называться, , а затем я пытался взаимодействовать с базой данных. Вы не можете взаимодействовать с базой данных, когда соединение уже закрыто.

Причина, по которой мой код пытался взаимодействовать с базой данных после того, как соединение было закрыто, связано с тем, что .update() является асинхронным.

Использование async.each работало для меня. async.each дает вам обратный вызов для запуска после того, как все, что происходит в коллекции, было выполнено. Я вызвал db.close() в этом обратном вызове, это время, когда я хотел закрыть соединение с базой данных.

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