试图通过node.js查询MongoDB,但不断出现奇怪的错误

时间:2017-05-11 03:26:06

标签: node.js mongodb

我在查询MongoDB时遇到错误:

var MongoClient = require('mongodb').MongoClient;
//assert = require('assert');


// Connection URL 
var url = 'mongodb://localhost:27017/myproject';
// Use connect method to connect to the Server 
 MongoClient.connect(url, function(err, db) {
//assert.equal(null, err);
if(err)
 throw err;
else{
console.log("Connected correctly to server");
var cursor = db.collection('documents').find({'_id':'01'});
cursor.forEach(function(err,doc) {
  if(err){
      throw err;
  } else{
      console.log(doc);
 }});
db.close();

}});

我得到的错误就是这个。

process.nextTick(function(){ throw err;});

[object Object]

任何帮助表示赞赏!感谢。

2 个答案:

答案 0 :(得分:0)

如果你使用nextObject()而不是forEach,你的代码应该做你想要的。

            var MongoClient = require('mongodb').MongoClient;
    //assert = require('assert');
    // Connection URL 
    var url = 'mongodb://localhost:27017/myproject';
    // Use connect method to connect to the Server 
    MongoClient.connect(url, function(err, db) {
    //assert.equal(null, err);
    if(err)
    throw err;
    else{
    console.log("Connected correctly to server");
    var cursor = db.collection('documents').find({'_id':'01'});
    //CHANGE HERE
    //cursor.forEach(function(err,doc) {
    cursor.nextObject(function(err,doc) {
    if(err){
        throw err;
    } else{
        console.log(doc);
    }});
    db.close();

    }});  

更新:

当您在光标上执行forEach时,回调会将文档作为第一个参数。所以你的if是抓住并投掷它。这就是为什么你开始看到这个错误。 这是因为node-mongodb-native驱动程序的行为方式 检查此How can I use a cursor.forEach() in MongoDB using Node.js?

nextObject函数将为您提供两个参数,第一个是错误,第二个是doc。 https://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject

答案 1 :(得分:0)

您的代码无效,因为您未向cursor.forEach提供正确的回调,并且因为该方法是异步的,因此您正在调用db.close()在您实际获取文档之前。

但是,因为您要查询单个文档,所以可以使用findOne代替,这样可以消除处理find返回的游标的复杂性:

MongoClient.connect(url, function(err, db) {
  if(err)
    throw err;
  else {
    console.log("Connected correctly to server");
    db.collection('documents').findOne({'_id':'01'}, function(err, doc) {
      if(err){
        throw err;
      } else{
        console.log(doc);
      }
      db.close();
    });
  }
});