使用猫鼬保存数组数据的更干净的代码

Cleaner code to save array data with mongoose

本文关键字:代码 数据 数组 保存      更新时间:2023-09-26

我创建了一个函数来使用以下逻辑将数据保存到mongoDB中,但是我真的很难重构代码并使其更清晰,有这么多烦人的代码重复,我怎么能有DRY原理?

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

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.');
    }
};

补充一下@JohnnyHK对您的问题的评论,最好在应用程序生命周期内保持猫鼬连接打开。除此之外,您可以使用一些 JavaScript 函数(如 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 来说已经足够了)