Node.js 节点、mongo和循环,如何在查找数据时中断循环
我的代码与此类似:Node.js 节点、mongo和循环,如何在查找数据时中断循环,node.js,mongodb,Node.js,Mongodb,我的代码与此类似: var mongo_client = require('mongodb').MongoClient, dataStorage; lib = { [...] find: function(res, param, callback) { var parentPath = param.path; while (parentPath !== '/') { collection.findOne({'paths'
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回调中设置数据存储值,有什么办法吗?如果我找到路径,它总是在所有路径块中运行。您的代码编写时就像是“传统的同步”代码一样,而事实并非如此。在findOne()返回结果之前,您无法检查数据存储的有效性——因此您的检查需要一直移动到内部的“if(data)”语句中。这不是mongodb的问题,这纯粹是nodejs的工作方式,以及所有内容都是异步的并且在回调上工作的事实 您的代码编写时就像是“传统的同步”代码一样,而事实并非如此。在findOne()返回结果之前,您无法检查数据存储的有效性——因此您的检查需要一直移动到内部的“if(data)”语句中。这不是mongodb的问题,这纯粹是nodejs的工作方式,以及所有内容都是异步的并且在回调上工作的事实 您的代码编写时就像是“传统的同步”代码一样,而事实并非如此。在findOne()返回结果之前,您无法检查数据存储的有效性——因此您的检查需要一直移动到内部的“if(data)”语句中。这不是mongodb的问题,这纯粹是nodejs的工作方式,以及所有内容都是异步的并且在回调上工作的事实 您的代码编写时就像是“传统的同步”代码一样,而事实并非如此。在findOne()返回结果之前,您无法检查数据存储的有效性——因此您的检查需要一直移动到内部的“if(data)”语句中。这不是mongodb的问题,这纯粹是nodejs的工作方式,以及所有内容都是异步的并且在回调上工作的事实 节点是异步的,因此必须相应地编写代码。一种选择是使用模块,该模块有很多工具来管理异步流 例如,您可以使用该功能管理
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');
节点是异步的,所以必须相应地编写代码。一种选择是使用模块,该模块有很多工具来管理异步流 例如,您可以使用该功能管理
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');
节点是异步的,所以必须相应地编写代码。一种选择是使用模块,该模块有很多工具来管理异步流 例如,您可以使用该功能管理
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');
节点是异步的,所以必须相应地编写代码。一种选择是使用模块,该模块有很多工具来管理异步流 例如,您可以使用该功能管理
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');
帮帮