将MongoDB查询中的文档分配给Node中的变量

时间:2018-04-06 06:06:44

标签: javascript node.js mongodb callback

我正在尝试将MongoDB文档对象分配给在Node.js服务器上运行的Javascript变量。我无法理解如何使用Node上的MongoDB驱动程序的异步行为来完成此操作。在我的主app.js文件中,我有以下内容

// MongoDB
//-------------------------------------------------
var DOC = require('./test_mongodb.js');
console.log(typeof(DOC)); //<---------------- this fails
console.log('Works:', JSON.stringify(DOC)); //<------------this fails

所需文件test_mongodb.js如下

const config = require('../config/mongodb.config.js'); // <--- This just pulls in the ip:port and database name...nothing special
const mongodb = require('mongodb');

var DOC = {};  // <------------------I want to store a document here

// Client
const mongoClient = mongodb.MongoClient;

// Connection URL
const mongoUrl = 'mongodb://' + config.db.host;
console.log(config.db.host);

// Use connect method to connect to the server
mongoClient.connect(mongoUrl, function(err, client) {
  if (err) {
    console.log('Unable to connect to the mongoDB server. Error:', err);
  }
  else {
    console.log("Connected to mongoDB server");

    // Select database
    const db = client.db('DATA');

    // Get the documents collection
    var coll = db.collection('TEST');

    //We have a cursor now with our find criteria
    var cursor = coll.find({"name": "testing"});

    //Lets iterate on the result
    var count = 0;
    cursor.each(function (err, doc) {
      if (err) {
        console.log(err);
      } else {
        console.log('Fetched:', doc);
        if (count == 3) {
          //console.log(typeof(doc));
          //DOC = JSON.parse(JSON.stringify(doc)) ;
          //console.log(typeof(DOC))
          //console.log('Inside:',DOC);
          DOC = doc; <----------------------just capture one doc
        }
        count = count + 1;
      }
    });
  }

  // Close connection when done
  client.close();

});
console.log(typeof(DOC));
console.log('Inside:',DOC);
module.exports = DOC;  // <-------------I want to export the variable here

console.log(typeof(DOC))app.js的输出未定义。总的来说,我意识到这是异步行为的问题,但我不明白如何纠正它。我已经读过解决方案是使用回调函数,但我不完全掌握这是如何用Mongo完成的。在你的解决方案中,请详细解释回调的实际工作方式,因为这是我的主要困惑。

另一个问题是... cursor.each和cursor.forEach之间有区别吗?

1 个答案:

答案 0 :(得分:0)

此处的问题是module.exports分配在查询完成之前发生。

你的环境可能支持Promises,所以你可以在这里返回一个。以下是您的代码应该如何:

test_mongodb.js

const config = require('../config/mongodb.config.js'); // <--- This just pulls in the ip:port and database name...nothing special
const mongodb = require('mongodb');

var DOC = new Promise(function(resolve, reject) {

    // Client
    const mongoClient = mongodb.MongoClient;

    // Connection URL
    const mongoUrl = 'mongodb://' + config.db.host;
    console.log(config.db.host);

    // Use connect method to connect to the server
    mongoClient.connect(mongoUrl, function(err, client) {
        if (err) {
            console.log('Unable to connect to the mongoDB server. Error:', err);
        } else {
            console.log("Connected to mongoDB server");

            // Select database
            const db = client.db('DATA');

            // Get the documents collection
            var coll = db.collection('TEST');

            //We have a cursor now with our find criteria
            var cursor = coll.find({
                "name": "testing"
            });

            //Lets iterate on the result
            var count = 0;
            cursor.each(function(err, doc) {
                if (err) {
                    console.log(err);
                } else {
                    console.log('Fetched:', doc);
                    if (count == 3) {
                        resolve(doc);
                    }
                    count = count + 1;
                }
            });
        }

        // Close connection when done
        client.close();
    });
})

module.exports = DOC;

然后等待在父母中解决的承诺。

app.js

require('./test_mongodb.js').then(function(DOC) {
    console.log(DOC);
}, function(err) {
    console.log(err);
});