Nodejs mongoDb中find()方法的回调函数不执行

Nodejs mongoDb中find()方法的回调函数不执行

  db.open(function(err,dbcont){
console.log(“in open”);
if(err){
console.log(err);
db.close();
}
// console.log(dbcont);
dbcont.collection(‘things’,function(err,collection){
console.log(“in collection”);
if(err){
console.log(“open collecion failed”);

  }
   //console.log(collection.find());
   collection.insert({xx:123},{safe:false});
  var cr= collection.find();//.toArray(function(err,docs){
   console.log(cr);
   cr.each(function(err,docs){
       console.log("in find to array");
       if(err){
           console.log("to Array Error");
       }
     console.log(docs);
   });
  // console.log(rs);

}); console.log(“ready to close”); res.end(“open succeed”); db.close();

});

open和db.collection的回调都执行了,为什么collection.find().toArray()的回调不执行呢。也就是console.log(docs)没有显示,而且 console.log(“in find to array”);这句也没执行。和网上的例子差不多啊,不好使呢?


3 回复

标题:Node.js MongoDB 中 find() 方法的回调函数不执行

内容: 在 Node.js 中使用 MongoDB 进行数据库操作时,有时会遇到 find() 方法的回调函数不执行的情况。这通常是因为查询结果为空或者某些错误未被捕获。以下是一个具体的示例代码,帮助你理解并解决这个问题。

const MongoClient = require('mongodb').MongoClient;

// 连接到 MongoDB 数据库
MongoClient.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
    if (err) {
        console.error('Failed to connect to MongoDB:', err);
        return;
    }

    console.log('Connected successfully to server');
    const db = client.db('test');
    
    db.collection('things', (err, collection) => {
        if (err) {
            console.error('Failed to get collection:', err);
            return;
        }

        console.log('Collection obtained successfully');

        // 插入数据
        collection.insertOne({ xx: 123 }, { safe: false }, (err, result) => {
            if (err) {
                console.error('Failed to insert data:', err);
                return;
            }

            console.log('Data inserted successfully');

            // 查询数据
            collection.find().toArray((err, docs) => {
                if (err) {
                    console.error('Failed to fetch data:', err);
                    return;
                }

                console.log('Fetched documents:', docs);

                // 关闭数据库连接
                client.close();
            });

            console.log('Ready to close');
        });
    });
});

解释

  1. 连接到 MongoDB:首先,我们使用 MongoClient.connect 方法连接到 MongoDB 数据库。
  2. 获取集合:然后,我们通过 db.collection 方法获取指定集合(本例中为 things)。
  3. 插入数据:接着,我们向集合中插入一条数据。
  4. 查询数据:最后,我们使用 collection.find().toArray() 方法查询数据,并将结果传递给回调函数处理。注意,这里使用了 toArray() 方法,它会自动调用回调函数并将所有文档作为数组返回。
  5. 关闭连接:完成操作后,记得关闭数据库连接以释放资源。

如果 find().toArray() 的回调函数不执行,可能的原因包括:

  • 查询条件有误或无匹配文档。
  • 错误处理不当,导致程序提前退出。
  • MongoDB 服务未正常运行。

确保你的 MongoDB 服务正在运行,并且数据库和集合名称正确无误。同时检查是否有其他错误信息输出,以便进一步排查问题。


上边那个是改用each方法后的代码。使用toArray的代码在这里

    db.open(function(err,dbcont){
    console.log("in open");
   if(err){
       console.log(err);
       db.close();
   }
   // console.log(dbcont);
   dbcont.collection('things',function(err,collection){
       console.log("in collection");
      if(err){
          console.log("open collecion failed");
  }
   //console.log(collection.find());
   collection.insert({xx:123},{safe:false});
  var cr= collection.find({}).toArray(function(err,docs){
       console.log("in find to array");
       if(err){
           console.log("to Array Error");
       }
     console.log(docs[0]);
   });
  // console.log(rs);

}); console.log(“ready to close”); res.end(“open succeed”); db.close();

});

根据你提供的代码片段,collection.find().toArray() 的回调函数没有执行的原因可能与 MongoDB 的驱动版本有关。在较新版本的 MongoDB 驱动(例如 mongodb 模块的版本 3.x 及以上)中,API 发生了一些变化。

在旧版本的驱动中,你需要使用 each 方法来遍历查询结果,而在新版本中,你应该直接使用 toArray 方法并提供一个回调函数来获取结果。以下是更新后的代码示例:

const MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/yourDatabase', { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
  if (err) {
    console.error(err);
    return;
  }

  const db = client.db();
  const collection = db.collection('things');

  collection.insertOne({ xx: 123 }, { w: 1 }, (err) => {
    if (err) {
      console.error(err);
      return;
    }

    collection.find().toArray((err, docs) => {
      if (err) {
        console.error(err);
      } else {
        console.log(docs);
      }

      // 关闭连接
      client.close();
    });
  });
});

解释:

  1. MongoClient.connect:用于连接到 MongoDB 数据库。
  2. insertOne:插入单个文档。注意 w: 1 表示写操作等待主节点确认。
  3. find().toArray:查询集合中的所有文档,并将结果以数组形式返回。这里使用 toArray 方法并提供一个回调函数来处理结果。
  4. client.close:关闭数据库连接。

确保你的 MongoDB 驱动版本是最新的,并且按照上面的方式进行编写。如果仍然有问题,请检查是否有其他错误信息或异常抛出。

回到顶部