Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用mongoose保存阵列数据的更干净的代码_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 使用mongoose保存阵列数据的更干净的代码

Javascript 使用mongoose保存阵列数据的更干净的代码,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我创建了一个函数,用下面的逻辑将数据保存到mongoDB中,但我真的很难重构代码并使其更干净,有这么多烦人的代码重复,我怎么能有枯燥的原则呢 逻辑: 1.传入一个标志以决定是否关闭DB连接。 2.根据传入的returnedArray创建不同的mongoDB模型并保存到DB中 var saveArrayToDB = function(returnedArray, flagToCloseDBConnection) { var objectToSave, object,

我创建了一个函数,用下面的逻辑将数据保存到mongoDB中,但我真的很难重构代码并使其更干净,有这么多烦人的代码重复,我怎么能有枯燥的原则呢

逻辑: 1.传入一个标志以决定是否关闭DB连接。 2.根据传入的
returnedArray
创建不同的mongoDB模型并保存到DB中

var saveArrayToDB = function(returnedArray, flagToCloseDBConnection) {
    var objectToSave,
        object,
        type = returnedArray[0].type,
        arrayToSave = [];

    if (type === 'user') {
        for (var i = 0; i < returnedArray.length; i++) {
            object = returnedArray[i];
            objectToSave = new User({
                fullName: object['full_name'],
                activatedAt: object['activated_at'],
                location: object['location'],
                timezone: object['timezone'],
                imageURL: object['mugshot_url'],
                stats: object['stats']
            });
            arrayToSave.push(objectToSave);
        }

        User.create(arrayToSave, function(err) {
            if (err) {
                console.log('err ' + err);
            }
            if(flagToCloseDBConnection) {
                mongoose.connection.close();
            }
        });
    } else if (type === 'group') {
        for (var j = 0; j < returnedArray.length; j++) {
            object = returnedArray[j];
            objectToSave = new Group({
                fullName: object['full_name'],
                createdAt: object['created_at'],
                stats: object['stats'],
                url: object['web_url']
            });
            arrayToSave.push(objectToSave);
        }

        Group.create(arrayToSave, function(err) {
            if (err) {
                console.log('err ' + err);
            }
            if(flagToCloseDBConnection) {
                mongoose.connection.close();
            }
        });
    } else {
        objectToSave = null;
        console.log('ERROR: unrecognized type in data. Not saved.');
    }

};
var saveArrayToDB=函数(returnedArray,flagToCloseDBConnection){
var objectToSave,
对象
类型=返回数组[0]。类型,
arrayToSave=[];
如果(类型==‘用户’){
对于(变量i=0;i
为了补充您对问题的评论,最好在应用程序生命周期中保持mongoose连接打开。除此之外,您还可以使用一些JavaScript函数,如来初始化数组,定义可以在create和map方法中重用的常见回调函数:

var saveArrayToDB = function(returnedArray, flagToCloseDBConnection) {
    var type = returnedArray[0].type,
        arrayToSave = [];

    var callback = function(err) {
        if (err) {  console.log('err ' + err); }
    };

    var newUser = function(u){
        return new User({
            fullName: u['full_name'],
            activatedAt: u['activated_at'],
            location: u['location'],
            timezone: u['timezone'],
            imageURL: u['mugshot_url'],
            stats: u['stats']
        });
    };

    var newGroup = function(g){
        return new Group({
            fullName: g['full_name'],
            createdAt: g['created_at'],
            stats: g['stats'],
            url: g['web_url']
        });
    };


    if (type === 'user') {      
        arrayToSave = returnedArray.map(newUser);       
        User.create(arrayToSave, callback);
    } else if (type === 'group') {
        arrayToSave = returnedArray.map(newGroup);
        Group.create(arrayToSave, callback);
    } else {
        console.log('ERROR: unrecognized type in data. Not saved.');
    }

};

不需要关闭连接。这是一个已经大大改进的版本:

var factories = {
    'user': {
        method: function(object){
            return {
                fullName: object['full_name'],
                activatedAt: object['activated_at'],
                location: object['location'],
                timezone: object['timezone'],
                imageURL: object['mugshot_url'],
                stats: object['stats']
            };
        },
        model: User
    },
    'group': {
        method: function(object){
            return {
                fullName: object['full_name'],
                createdAt: object['created_at'],
                stats: object['stats'],
                url: object['web_url']
            };
        },
        model: Group
    }
}

var saveArrayToDB = function(returnedArray) {
    var saveQueue=[],
        factory = factories[returnedArray[0].type];
    if(!factory){
        return console.log('ERROR: unrecognized type in data. Not saved.');
    }

    returnedArray.forEach(function(item){
        saveQueue.push(factory.method(item));
    });

    factory.model.create(saveQueue, function(err){
        if(err){
            console.log('err ' + err);
        }
    });
};

(您不需要传递文档实例,普通对象对于Model.create来说已经足够好了)

您测试过这个吗?仅通过检查,该行
saveQueue.push(工厂方法(项目))
将引发错误,因为
factory
不是对象,而是字符串(来自
factory=returnedArray[0]。键入;
)。我认为您需要首先创建工厂对象,或者只需执行saveQueue.push(factories[factory].method(item))谢谢分享您的想法!在这里使用
工厂
肯定有帮助。我想知道传递实例而不是普通对象是否会使代码更具可读性?优雅的代码!我知道
map()
,但我不知道如何像您在这里那样灵活地使用它。此代码不是web服务器的一部分,它旨在由管理员在后端运行以定期刷新数据。刷新数据后,应关闭数据库连接。我会把这个标记为solution@XiXiao谢谢至少它是可读的,并且对于您的用例,您应该能够适当地添加连接关闭逻辑。