8

それで。私は非常に基本的なスクリプトを持っています。これはデータベースに接続しfind、多くのドキュメントを含むコレクションに対して実行し、3つのアイテムに制限します。null結果の最後に、成功した後に接続を静かに閉じる代わりに、スクリプトが終了しないことを除いて、すべてがスムーズに実行されます。

ここで、パラメータを宣言し、データベースオブジェクトを作成します。

var SERVER = 'localhost',
 PORT = 27017,
 DATABASE = 'test',
 COLLECTION = 'coll',
 mongo = require('mongodb'),
 db = new mongo.Db(DATABASE,
  new mongo.Server(SERVER, PORT, {auto_reconnect: true}),
  {});

そして、ここでデータベースに接続し、findカーソルとeach関数を使用してデータベースのクエリを実行します。

db.open(function(err, db) {
 if(err) throw err;
 var collection = new mongo.Collection(db, COLLECTION),
  cursor = collection.find({}, {}).limit(3);
 cursor.each(function(err, doc) {
  if(err) throw err;
  console.log(doc);
 });
 db.close();
});

結果は素晴らしいです:

{ _id: '1',
  a: 'first object' }
{ _id: '2',
  a: 'second object' }
{ _id: '3',
  a: 'third object' }

まで

null

が表示されます。

上で正確に述べたように、スクリプトは終了しないように進みます。

理由がわからないので、うまく終了させる方法についてのポインタをいただければ幸いです。

4

2 に答える 2

10

この質問は数年前のものであり、すでに可能な答えがありますが、これを読んだ後もまだ混乱している人のために、別の可能性を指摘したいと思います。結局、カーソルが使い果たされたときに実際にnullを返すことを意図した呼び出しをeach繰り返し呼び出します。nextObject

ここでの答えは私が必要としたものでした:Node Mongo Native-カーソルが使い果たされたことを知る方法は?

Node MongoDBドライバードキュメントから:http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject

于 2015-06-23T20:09:26.653 に答える
7

まあ、それは愚かでした。非同期設定でプログラミングしないと時間がかかりすぎて、間違いを犯します。ループがdb.close()終了する前に呼び出しが行われました。eachそのために戻っnullて絞首刑になりました。正しいコードは次のとおりです。

db.open(function(err, db) {
 if(err) throw err;
 var collection = new mongo.Collection(db, COLLECTION),
  cursor = collection.find({}, {}).limit(3);
 cursor.each(function(err, doc) {
  if(err) throw err;
  if(doc !== null) console.log(doc);
  else db.close();
 });
});

どういうわけか、誰かに数分節約できることを願っています。

于 2012-08-30T22:24:06.020 に答える