13

我在玩 mongodb 并将一些测试数据 {name:"david"} 输入到“用户”集合中。我通过键入使用 mongo shell 验证了数据在 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 正确指出的那样,您在检索数据之前关闭了数据库连接。我知道它看起来不像,但 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

这种模式在我的 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);
                    }
                });
            }
        }
    }});

这是关于 node + mongo 的另一个教程,可能会有所帮助: http ://howtonode.org/express-mongodb

于 2012-07-27T22:34:20.673 回答
3

尝试将您的节点升级到最新版本。

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

0.4 版可能无法正常工作。

于 2013-08-07T06:55:21.600 回答