节点,mongo和循环,当我找到数据时如何打破循环

时间:2015-02-20 10:43:32

标签: 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' : 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,如果我找到路径,它总是通过所有路径块运行。

2 个答案:

答案 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的工作原理,以及一切都是异步的并且可以在回调上运行的事实。