承诺mongodb和nodejs中的挂起错误

时间:2016-02-24 14:13:24

标签: javascript node.js mongodb

我已经编写了node.js代码,用于使用mongodb数据库获取一些数字。这是我的代码

    MongoClient.connect('mongodb://localhost:27017/mongomart', function(err, db) {

    assert.equal(null, err);

    var numItems=db.collection('item').find({"category":category}).count();

    callback(numItems);
});

这个mongodb查询在mongo shell上运行正确,但在使用node.js时出错了

Promise <Pending>

我不知道这个“承诺”是什么?请帮忙..

4 个答案:

答案 0 :(得分:8)

node.js代码是异步的,因此numItems不包含项目数 - 它包含Promise,其中包含解析后的项目数。你必须掌握node.js和异步编程的基础知识。尝试像这样修改你的代码

MongoClient.connect('mongodb://localhost:27017/mongomart', function(err, db) {
  assert.equal(null, err);
  db.collection('item').find({"category":category}).count()
    .then(function(numItems) {
      console.log(numItems); // Use this to debug
      callback(numItems);
    })
});

对于原生Promise签出文档https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise

另请参阅bluebird promises https://github.com/petkaantonov/bluebird

答案 1 :(得分:3)

promise是在等待实际值时给出的替代临时值。要获得真正的价值吗

numItems.then(function (value) { callback(value) });

或者更好的是,从函数返回promise,让他们使用Promises模式而不是回调模式来实现它。

答案 2 :(得分:1)

有同样的问题。不知道它是否仍与你相关,但这就是为我解决的问题:

var category = 'categoryToSearch';
var cursor = db.collection('item').find({'category':category});

cursor.count(function (err, num) {
    if(err) {
        return console.log(err);
    }
    return num;
});

答案 3 :(得分:0)

我试图解决一个类似的问题,但无论我做什么,document.save() 选项都只会给出 Promise{pending}。这是我所做的:

  • (req,res) 更改为 async(req,res)
  • var post = doc.save() 更改为 var post = await doc.save()

最后,登录MongoDB web,将可访问的IP地址改为0.0.0.0(所有地址)。即使您的 IP 被列入白名单,不这样做有时也会导致问题。