我无法从调用MongoDB的数据中检索数据。 调用工作正常,因为我可以向控制台显示结果,但是当我尝试将这些结果写入/复制到外部数组以便它们可用于我的程序时,在通话之外,我什么也得不到。 我见过的每个例子都在连接循环中完成所有工作。我找不到任何将结果复制到数组(全局或传入),连接结束,程序继续处理外部数组的示例。
大多数示例代码都是过于简单化(即只是连接循环中的console.log)或者过于复杂,以及如何制作快速api路由的示例。我不需要这个,因为我正在进行老式的串行批处理。 我知道Mongo是异步构建的,但我仍然可以使用它。
MongoClient.connect('mongodb://localhost:27017/Lessons', function (err, db) {
assert.equal(err, null);
console.log("Connectied to the 'Lessons' database");
var collection = db.collection('students');
collection.find().limit(10).toArray(function(err, docs) {
// console.log(docs);
array = docs.slice(0); //Cloning array
console.log(array);
db.close();
});
});
console.log('database is closed');
console.log(array);
看起来我正在尝试在循环完成之前记录数据。但是如何同步时机? 如果有人可以向我解释这一点,我会非常感激,因为我已经盯着这些东西好几天了,我真的感觉很蠢。
答案 0 :(得分:0)
从您共享的代码中,您希望数组在最后的console.log中显示吗?这不适用于您当前的设置,因为2 console.log将在对数据库的查询完成之前运行。
您应该使用回调功能获取结果。如果你不确定那些是什么,你将需要学习mongo / node在任何地方使用它们。基本上javascript被设计为运行得非常快,并且在进入下一行代码之前不会等待完成某些事情。
在我第一次学习时,本教程对我帮助很大:https://zellwk.com/blog/crud-express-mongodb/
您能告诉我们您运行此mongo请求的环境是什么吗?它会提供更多背景,因为现在我不确定你是如何使用mongo的。
答案 1 :(得分:0)
感谢您的快速反应。
环境是Windows7,mongod实例在后台运行,所以我连接到localhost。我正在使用我创建的数据库,但您可以使用任何集合来运行示例代码。
我说过我认为这是时间问题。您的观察结果“最终的2个console.log将在对数据库的查询完成之前运行”,这真的为我解释了这个问题。
我在connect()之后用以下代码替换了代码:
function waitasecond(){
console.log(array);
}
setTimeout(waitasecond, 2000);
阵列已完全填充。这表明我试图做的事情,至少是我想做的事情,是不可能的。我想我有两个选择。
顺序处理(正如我最初所说) - 在开始之前,我必须花费一些时间延迟让db调用完成。
使用所有需要处理的代码创建一个函数,并在数据库返回数据时从数据库回调内部调用它。
第一个选择有点臭。我不想在生产中看到它,所以我想我会选择第二种选择。
感谢您推荐的链接。我快速浏览了一下,对我来说问题是,这是一个非常常见的模式,它依赖于快速侦听路由器调用来响应。我正在进行的处理与路由器调用无关。
啊,对于同步的好时光。