使用Node.js进行回调递归插入Mongo

手册

我正在使用Node.js和MongoDB(Mongoose.js)做API。我制作了一个“安装”脚本,用一些示例数据(例如用户和其他内容)填充数据库。

问题是当我尝试添加递归插入时。

我将999个文档添加到一个集合(父亲)中,然后将12个文档添加到另一个集合(儿子)中的每个父亲文档中。

父亲收藏有999份文件。但是,当我期望Sons集合中有11988个文档时,儿子的集合只有1188个。

模型是正确的。我有很多单元测试可以验证这些操作。

这是我的代码:

var mongoose = require('mongoose');
var conf = require('../config/dbConfig');
var fatherDb = require('../model/father');
var sonsDb = require('../model/son');
var db_lnk = conf.mongoSrv();
global.db = (global.db ? global.db : mongoose.createConnection(db_lnk));

function addFather(idSome, idOther){
    console.log("Adding Fathers");
    fatherDb.count({active:true}, function(err,count){
        if(!err){
            var max = (999-count);
            for(i=0; i<max; i++){
                var father = new fatherDb({
                    "name":"Father "  + (i+1),
                    "createdBy" : "55ad5f224f350c123b8e2bda",
                    "modifyBy" : "55ad5f224f350c123b8e2bda",
                    "active" : true,
                    "_some" : idSome,
                    "_other" : idOther,
                    "__v" : 0
                });
                father.save(function(err, data){
                    console.log("Adding 12 Sons to Father # " + i);
                    var idFather = data._id;
                    for (var x = 1; x < 13; x++) {
                        var son = new sonsDb({
                            "name": "Son " + x,
                            "position": x,
                            "createdBy": "55ad5f442f350c431b8e2bda",
                            "modifyBy": "55ad5f442f350c431b8e2bda",
                            "active": true,
                            "_father": idFather,
                            "__v": 0
                        });
                        son.save(function (err) {
                            console.log("Adding Son " + x);
                            if(i == max) {
                                endInstall();
                            }
                        });
                    }
                });
            }
        }else{
            console.log("Error");
            endInstall();
        }
    });
}

function endInstall(){
    console.log("Ending Installation");
    process.exit();
}

addFather('SOMEid','OtherId');
伊格纳西奥·拉戈(Ignacio Lago)

.save()是一个异步函数,因此for循环将在它们完成之前继续运行它们。这样i可以max比您预期的更快。

换句话说,i到达目标maxfather.save被解雇,但尚未完成,并且son.saveendInstall()过早执行

异步是一个库来处理这种情况。如果要继续使用计数器,请查看times方法

就像是:

// generate max fathers
async.times(max, function(n, next_father){
  var father = ...
  father.save(function(err){
    // generate 12 sons
    async.times(12, function(m, next_son){
      var son = ...
      son.save(function(err){
        next_son(err);
      });
    }, function(err, sons){
      next_father(err);
    });
  });
}, function(err, fathers) {
  // it's done
});

这样,您可以确定所有步骤都已完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用JS进行回调

来自分类Dev

如何以递归方式使用 JS 回调?

来自分类Dev

如何进行适当的Node.js错误回调?

来自分类Dev

如何进行适当的Node.js错误回调?

来自分类Dev

使用Bluebird在Promise中包装Node.js回调

来自分类Dev

使用Node.js更好地了解回调

来自分类Dev

使用MySQL的Node.js原型和嵌套回调

来自分类Dev

Node.js如何使用函数的回调结果

来自分类Dev

使用Node.js回调的明显时间更少

来自分类Dev

Node.js-在回调函数中使用数据

来自分类Dev

功能-Node.js中的异步映射,递归和回调的组合

来自分类Dev

使用Promise进行递归意味着已注册的回调被多次调用

来自分类Dev

使用CompletableFuture进行回调

来自分类Dev

Node.js,Express和Mongo:循环中的回调函数被忽略

来自分类Dev

在Node.js中,如何使用node-seq嵌套嵌套回调

来自分类Dev

使用Node.js + CoffeeScript + MySQL进行几个相关的插入

来自分类Dev

如何使用Sequelize和node.js进行批量插入

来自分类Dev

Node.js异步循环,下一个循环之前从函数进行回调

来自分类Dev

Node.js异步循环,下一个循环之前从函数进行回调

来自分类Dev

node.js回调函数dynamodb

来自分类Dev

node.js从回调发送响应

来自分类Dev

如何返回Node.js回调

来自分类Dev

Node.js回调功能

来自分类Dev

Node.js回调地狱

来自分类Dev

来自node.js的回调函数

来自分类Dev

Node.js-回调参数

来自分类Dev

Node JS上的HTTP请求回调

来自分类Dev

node.js通过回调?

来自分类Dev

Node.js中的回调顺序