在批量插入mongoose / mongodb之前使用DB验证所有数据

时间:2016-07-01 17:10:59

标签: node.js mongodb express mongoose mean-stack

我试图在将对象插入mongodb之前验证对象数组。

我想要做的是,假设我有一个像下面的对象

    var data= { prodDetails: 
       [ 
         { measured: 'Liters',
           name: 'A',
           prodCode: '713',
           status: true },
         { measured: 'Liters',
           name: 'B',
           prodCode: '713',
           status: true },
         { measured: 'Liters',
           name: 'C',
           prodCode: '674',
           status: true } 
]
};

在进行批量插入调用之前,我想检查给定的prodCode是否是有效的数据库代码,name是否重复

我正在使用node bluebird个承诺。

我尝试了以下代码来验证prodCode

var bulkOperations = {
    bulkProdInsert: function (body) {
        return new Promise(function (reslv, rej) {
            if (body.prodDetails.length > 0) {
                common_lg.getValueById(body, "typesProd", body.prodDetails[0].prodCode).then(bulkOperations.successCallback(reslv, rej, body)).catch(bulkOperations.errCallback(reslv, rej, body));
            };
            reslv();
        });
    },

    successCallback: function (reslv, rej, body) {
        return function (res) {
            if (res) {
                body.prodDetails.splice(0, 1);
                if (body.prodDetails.length > 0) {
                    common_lg.getValueById(body, "typesProd", body.prodDetails[0].prodCode).then(bulkOperations.successCallback(reslv, rej, body)).catch(bulkOperations.errCallback(reslv, rej, body));
                }
            };
        };
    },

    errCallback: function (reslv, rej, body) {
        return function (err) {
            body.prodDetails.splice(0, 1);
            if (body.prodDetails.length > 0) {
                common_lg.getValueById(body, "typesProd", body.prodDetails[0].prodCode).then(bulkOperations.successCallback(reslv, rej, body)).catch(bulkOperations.errCallback(reslv, rej, body));
            };
        };
    }
};

但我想要做的是在验证所有对象/文档的nameprodCode时将所有对象/文档插入到数据库中。

如何实现这一点。

感谢

1 个答案:

答案 0 :(得分:0)

听起来你想要检查输入对象,然后进行数据库调用。我建议使用.map method of bluebird

var promise = require('bluebird'); var checkValues = promise.method( function(prod){ if( isValid(prod.prodCode) ){ return prod; } //something went wrong! throw new Error('prodCode ' + prod.prodCode + ' is invalid'); } promise.map( data.prodDetails, checkValues ) .then(function(){ //it worked! You can call the DB now. }) .catch(function(error){ //something went wrong, look at that error (or pass along) })

只要您的checkValues方法是一个承诺,您就可以针对输入数组中的每个值运行它,并使用.then的成功来了解工作情况并调用您的数据库!