13

私は mongodb をいじっていて、いくつかのテスト データ {name:"david"} を 'users' コレクションに入力しました。次のように入力して、mongoシェルを使用してデータがMongoDBにあることを確認しました

db.users.find()

結果:

{ "name":"david" }

node.js スクリプトでは、次のコード:

db.open(function(err, db) {
    if (!err) {
        console.log("db opened!");
    }
    else {
        console.log(err);
    }
    db.collection('users', function(err, collection) {
        collection.find({}, function(err, cursor) {
            cursor.each(function(err, item) {
                console.log(item);
            });
        });
    });
    db.close();
});

結果を返しません

何も問題はありませんし、エラーも返されません。お知らせ下さい

4

4 に答える 4

10

コレクションからのデータが返される前に、実際にはデータベース接続を閉じています。

db.collection('users', function(err, collection) {
  collection.find({}, function(err, cursor) {
    cursor.each(function(err, item) {
      console.log(item);
    });

    // our collection has returned, now we can close the database
    db.close();
  });
});
于 2012-07-28T00:24:40.873 に答える
4

CJohn が正しく述べているように、データを取得する前に DB 接続を閉じています。似ていないことはわかっていますが、これは Node 構造とコールバックの場合です。これを正しく処理するコードは次のとおりです。

db.open(function(err, db) {
    if (err) return console.log('error opening db, err = ', err);

    console.log("db opened!");

    db.collection('users', function(err, collection) {
        if (err) return console.log('error opening users collection, err = ', err);

        collection.find({}, function(err, cursor) {
            if (err) return console.log('error initiating find on users, err = ', err);

            cursor.each(function(err, item) {
                // watch for both errors and the end of the data
                if (err || ! item) {
                    // display (or do something more interesting) with the error
                    if (err) console.log('error walking data, err = ', err);

                    // close the connection when done OR on error
                    db.close();

                    return;
                }
                console.log(item);
            });
        });
    });
});
于 2012-07-29T06:36:04.670 に答える
3

ノードを最新バージョンにアップグレードしてみてください。

sudo npm cache clean -f
sudo npm install -g n
sudo n stable

バージョン 0.4 では正しく動作しない可能性があります。

于 2013-08-07T06:55:21.600 に答える
3

このパターンは、私の node/mongo サンプルでは正常に機能しています。この関数には、エラー、コレクションを受け取るコールバックが渡されます。「ユーザー」コレクションを取得し、成功した場合は、コレクションに対して find を呼び出して配列に変換しますが、カーソルでも反復処理できます。

db.collection と connection.find 呼び出し内では、エラーと処理をチェックしていません。あなたはオープンコールでのみそれをやっています。

また、特に接続プール オプションを使用して開いている場合は、db.close() を呼び出さないでください (呼び出しごとに接続を開いたり閉じたりしたくない場合)。閉じたい場合は、コールバック内で閉じます。

何かのようなもの:

var server = new Server(host, port, {auto_reconnect: true, poolSize: 5}, {});

MyStore.prototype.getUsers = function(callback) {
server.open(function(err, db) {
    if (err) {
        callback(err);
    }
    else {
        db.collection('users', function(err, collection) {
            if( err )
                callback(err);
            else {
                collection.find().toArray(function(err, users) {
                    if (err) {
                        callback(err)
                    } else {
                        callback(null, users);
                    }
                });
            }
        }
    }});

ノード + mongo に関する別のチュートリアルが役立ちます: http://howtonode.org/express-mongodb

于 2012-07-27T22:34:20.673 に答える