用mongoose保存数组数据的清洁代码

我用下面的逻辑创build了一个将数据保存到mongoDB中的函数,但是我真的很难重构代码并使其更清洁,有太多讨厌的代码重复,我怎么能有DRY原理?

逻辑:1.通过一个标志来决定是否closures数据库连接或结束。 2.根据returnedArray数组创build不同的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对你的问题的评论,最好在应用程序生命周期中保持你的mongoose连接打开。 除此之外,您可以使用一些JavaScript函数(如map()来初始化数组,定义可在create和map方法中重用的常用callback函数:

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

无需closures连接。 这是一个已经大大改进的版本:

 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来说已经足够了)