我已经编写了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>
我不知道这个“承诺”是什么?请帮忙..
答案 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 被列入白名单,不这样做有时也会导致问题。