【问题标题】:nodejs mongodb cursor problemsnodejs mongodb游标问题
【发布时间】:2013-11-29 21:34:35
【问题描述】:

我有这个函数,我想返回一个 mongo 查询的值,但我得到了未定义的值。我正在尝试读取我的测试数据库的用户集合中所有用户的电子邮件地址。

这是我的代码:

var mongo = require('mongodb').MongoClient;
var connectionString = "mongodb://cannotdivulge.info.com:53778/testdb";
var users;
var db = mongo.connect(connectionString, function(err, db) {
    if(err)
        throw err;
    console.log("connected to database");
    users = db.collection('users');
});

exports.findAll = function(req, res) {
    var cursor = users.find();
    var result;
    cursor.each(function(err, doc) {
        if(err)
            throw err;
        result = doc.Email;
    });
    res.send(result);
};

result 应该等于电子邮件地址,但它是未定义的。 doc.Email 的值没有被保留。当我将 res.send() 放在 cursor.each() 中时,它会返回一个值。

另外,在实际返回它的值之前,我需要在函数中使用结果变量。这就是为什么我需要保留它的价值。

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    您的 findall 函数是异步的。只有在完成列表后,您才需要返回结果。在您的代码中,该函数在 each 的第一个回调开始之前返回了 result 的值。

    exports.findAll = function(req, res) {
        var cursor = users.find();
        var result = [];
        cursor.each(function(err, doc) {
            if(err)
                throw err;
            if (doc === null) {
                // doc is null when the last document has been processed
                res.send(result);
                return;
            }
            // do something with each doc, like push Email into a results array
            result.push(doc.Email);
        });
    };
    

    【讨论】:

    • 正确。如果您要获取一堆文档,将它们放在一个数组中并发送回客户端,您可以考虑使用cursor.toArray(function(err, docs){}),它会为整个结果集进行回调。见cursor.toArray
    • @WiredPrairie 但是如果我想在返回函数值之前在另一个查询中使用结果变量怎么办?比如说我收到了电子邮件,我想对照另一个集合检查它?在返回它之前,我需要再次使用该变量。这就是为什么我需要这个值不是未定义的。
    • 等到你得到结果,然后进行下一步?你似乎在问一个新问题?
    • @martingreber - 是的,当然你可以在某些情况下使用toArray。它只是在数组内部使用相同的基本技术自动执行一个非常简单的循环。它假定您有足够的 RAM/内存来保存数组结构。
    • @WiredPrairie - 我不是在问一个新问题,我想我最初只是没有提到它,但我编辑了我的问题。无论如何,感谢您的回答启发了我。我试图做的是检查用户的电子邮件是否正确,以便我可以使用它(如果电子邮件正确)来查询数据集合,其中数据基于用户的电子邮件。
    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多