【问题标题】:How can I access mongodb count results in nodejs with a callback?如何通过回调访问 nodejs 中的 mongodb 计数结果?
【发布时间】:2013-12-17 12:00:28
【问题描述】:

如何在 nodejs 中访问 mongodb 计数结果,以便异步请求可以访问结果?我可以获得结果并更新数据库,但异步请求无法访问变量或变量为空,并且在发出下一个异步请求时变量似乎已更新。请求不得等待查询完成,并且下一个请求将填充上一个请求的变量。

testOne.increment = function(request) {   
    var MongoClient = require('mongodb').MongoClient,
        format = require('util').format;
    MongoClient.connect('mongodb://127.0.0.1:27017/bbb_tracking', function(err, db) {
    if (err) throw err;
    collection = db.collection('bbb_tio');
        collection.count({vio_domain:dom}, function(err, docs) {
    if (err) throw err;                                     
    if (docs > 0) {
            var vio_val = 3;                                        
        } else {
            var vio_val = 0;                    
        }                   
        if (vio_val === 3) {
                event = "New_Event";
        var inf = 3;
            }                                       
        db.close();

        console.log("docs " + docs);
        });       
   });                    
};

在上面,即使变量被设置在范围内,它们也不是异步定义的。我能否获得一些关于正确构建它的指导,以便在回调中填充变量。谢谢!

【问题讨论】:

  • 你能澄清你的问题吗?目前尚不清楚问题是什么。
  • 我将问题更改为“如何通过回调访问 nodejs 中的 mongodb 计数结果?”我无法将 var 结果放入等待查询完成的回调中。这有帮助吗?谢谢!

标签: javascript node.js mongodb asynchronous


【解决方案1】:

由于count 函数是异步的,您需要将回调传递给increment 函数,以便在从数据库返回count 时,代码可以调用回调。

testOne.increment = function(request, callback) {   
    var MongoClient = require('mongodb').MongoClient,
        format = require('util').format;
    MongoClient.connect('mongodb://127.0.0.1:27017/bbb_tracking', function(err, db) {
        if (err) throw err;
        var collection = db.collection('bbb_tio');
        // not sure where the dom value comes from ?
        collection.count({vio_domain:dom}, function(err, count) {
            var vio_val = 0;
            if (err) throw err;                                     
            if (count > 0) {
                vio_val = 3;                                        
                event = "New_Event";
                var inf = 3;
            }                                       
            db.close();

            console.log("docs count: " + count);        
           // call the callback here (err as the first parameter, and the value as the second)
           callback(null, count);   
        });       
   });                 
};

testOne.increment({}, function(err, count) {
   // the count would be here...
});

(我不明白你使用的变量是什么意思,或者为什么以后不使用它们,所以我只是做了一些清理工作。变量的作用域是功能块并提升到该函数,因此您无需像使用 vio_val 那样在每个 if 块中重新声明它们。

【讨论】:

  • 你好有线海盗。太感谢了!我现在正在尝试。
  • 回调错误(null, docs); ReferenceError: docs is not defined 现在正在处理它。
  • 什么?我不明白你的评论。
  • 抛出错误,文档未定义,回调(null, docs);,最后一个回调。
  • 我调整了我的代码以使用不同的变量名称,但如果将概念正确复制到您的代码中,上面的代码应该可以正常工作。 docs/count 变量应该是传递给count 函数回调的参数名称。如果您在正确的块中没有回调,它将无法工作,并且您会收到该错误。
【解决方案2】:

您可以使用“异步”模块。它使代码更清晰,更易于调试。在下面的帖子中查看 GitHub 中 adduser.js 和 deleteuser.js 的代码

http://gigadom.wordpress.com/2014/11/05/bend-it-like-bluemix-mongodb-using-auto-scaling-part-2/

问候 象头神

【讨论】:

    【解决方案3】:

    长度给你结果数组的计数

      const userdata = await User.find({ role: role, 'name': new RegExp(searchkey, 'i')  },{date: 0,__v:0,password:0}).
          sort(orderObj)
          .limit(limit)
          .skip(skip);
    
    
    
          console.log(userdata.length);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多