我的代码与此类似:
var mongo_client = require('mongodb').MongoClient, dataStorage;
lib = {
[...]
find: function(res, param, callback) {
var parentPath = param.path;
while (parentPath !== '/') {
collection.findOne({'paths' : parentPath}, {...}, function(err, data)) {
if (data) {
dataStorage = data;
callback(data, res);
}
}
if (dataStorage) {
return;
}
parentPath = lib.removeLastBlockOfPath(parentPath);
}
if (!dataStorage) {
callback(someDefaultData, res);
}
}
[...]
}
我想要做的是找到一些存储在mongo中的路径,或者如果没有匹配,请尝试找到第一个匹配的父路径。
我无法通过findOne回调设置dataStorage值是否可以这样做? Eaven,如果我找到路径,它总是通过所有路径块运行。
答案 0 :(得分:3)
节点是异步的,因此必须相应地编写代码。一个选项是使用async
模块,它有许多工具来管理异步流程。
例如,您可以使用whilst功能来管理while
循环:
find: function(res, param, callback) {
var parentPath = param.path,
dataStorage = null;
async.whilst(
function () { return parentPath !== '/'; },
function (done) {
collection.findOne({'paths' : parentPath}, {...}, function(err, data) {
if (data) {
dataStorage = data;
return callback(data, res);
}
parentPath = lib.removeLastBlockOfPath(parentPath);
done();
});
},
function (error) {
if (!dataStorage) return callback(someDefaultData, res);
}
);
}
不要忘记安装并需要async
模块:
var async = require('async');
答案 1 :(得分:0)
您的代码就像是“传统同步”一样 - 它不是。在findOne()的结果返回之前,您无法检查dataStorage的有效性 - 因此您的检查需要一直移动到内部的“if(data)”语句中。这不是一个mongodb问题,这纯粹是nodejs的工作原理,以及一切都是异步的并且可以在回调上运行的事实。