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');
帮帮