我最难找到应该如此简单的事情的解决方案。我想在 mongo 数据库中找到一个文档并将其存储在一个变量中,我可以在节点.js应用程序的任何地方使用。
我认为我得到的最接近的是
var path = db.collection('paths').find().toArray()
其中 path 是保存一个文档的集合,但随后 console.log(path[0])
返回未定义。
尝试异步方式,如下所示
var path;
db.collection('paths', function(err, collection) {
collection.find({}).toArray(function(err, results) {
path = results;
console.log(results);
});
});
注意
切勿尝试在节点中同步运行 IO 操作.js因为 node.js 是单线程的。如果这样做,则会阻止整个应用程序。mongodb nodejs native提供的API是异步的,这意味着结果预计在未来的某个时间点,但不会立即出现。一旦结果可用,就会调用回调函数并得到结果。
如果你来自同步编码背景,这是一个范式转变。你需要改变主意,异步思考。
可能我回答这个问题迟到了。我已经开始使用 nodejs
并且正在使用 MongoDB 来存储所有数据,在寻找将文档保存在变量中的解决方案时遇到了同样的问题。
如您所知,查询是异步的,这样您就无法在变量中分配结果,而不是这样做,您必须使用函数作为回调并在那里返回值。
这是我在项目中使用的示例代码:
var verifyUserExists = function(db, callback, username) {
var collection = db.collection('users');
collection.findOne({ 'login': username }, function(err, doc) {
assert.equal(null, err);
callback(doc);
});
}
mongoClient.connect(mongoUrl, function(err, db) {
assert.equal(null, err);
console.log('Connected successfully to server');
verifyUserExists(db, function(userExists) {
console.log(userExists);
db.close();
}, username);
});
如果你想对返回的文档做其他操作,你必须在回调中做,如果你尝试将回调函数中的值返回给全局变量,你会得到undefined
,因为代码是异步执行的。