node.js MongoDB查询不返回结果

时间:2012-07-27 22:24:48

标签: node.js mongodb

我正在玩mongodb并在'用户'集合中输入了一些测试数据{name:“david”}。我通过键入

验证了数据是在MongoDB中使用mongo shell
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 个答案:

答案 0 :(得分: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();
  });
});

答案 1 :(得分: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);
            });
        });
    });
});

答案 2 :(得分:3)

此模式在我的node / mongo示例中正常工作。该函数传递一个回调,它接受错误,收集。它获取'用户'集合,如果成功,则调用查找集合并将其转换为数组,但您也可以迭代光标。

在db.collection和connection.find调用中,您没有检查错误和处理。你只是在公开电话上这样做。

此外,您不应该调用db.close(),尤其是当您使用connection pool option打开时(您不希望在每次调用时打开和关闭连接)。如果你确实想关闭,那么关闭回调内部。

类似的东西:

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

答案 3 :(得分:3)

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

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

版本0.4可能无法正常工作。