【问题标题】:node.js MongoDB query not returning resultsnode.js MongoDB查询不返回结果
【发布时间】:2012-07-26 15:24:32
【问题描述】:

我在玩 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();
});

不返回任何结果

我没有发现任何错误,也没有错误返回。请指教

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您实际上是在集合中的数据返回之前关闭数据库连接。

    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();
      });
    });
    

    【讨论】:

      【解决方案2】:

      正如 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);
                  });
              });
          });
      });
      

      【讨论】:

        【解决方案3】:

        这种模式在我的 node/mongo 示例中运行良好。该函数被传递一个回调,该回调接受错误,集合。它获取“用户”集合,如果成功,则针对集合调用 find 并将其转换为数组,但您也可以在光标上进行迭代。

        在 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

        【讨论】:

          【解决方案4】:

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

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

          0.4 版可能无法正常工作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多