使用猫鼬保存数组数据的更干净的代码
Cleaner code to save array data with mongoose
我创建了一个函数来使用以下逻辑将数据保存到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 来说已经足够了)
相关文章:
- SIMPLE Javascript代码,用于显示谷歌电子表格中单个字段的数据
- 在将csv文件中的数据分配给数组变量时增强了d3代码
- 从HTML代码中提取数据
- jQuery代码,用于在检查行时获取其他列的数据
- 如何使用代码点火器使用Bootstarp数据表搜索数据嵌套表数据
- Scrapy和Xpath从javascript代码中提取数据
- 正在代码隐藏中检索选定ListBox项的属性数据
- 调整从选择输入中获取数据并将其放入 DIV 的 jQuery 代码
- 如何在控制器代码点火器中从 ajax 获取数据
- 在我的代码中管理大量硬编码数据的最佳方法
- 在不更改大量代码的情况下重新构造Firebase JSON数据
- 用于在表中添加行的Javascript代码将单元格中的数据复制到新行中
- 从外部json代码向amcharts图表添加数据
- 需要Javascript或jquery代码将数据传递给控制器
- 如何在检索到数据后使用drawCallback执行代码
- 如何用javascript创建三维数组我想把数据插入数组中,这有助于我的代码
- 具有通用代码和唯一数据的HighGlobal配置&标题
- 在我的谷歌自定义搜索引擎从服务器获取数据后,我如何激发一些javascript代码
- 具有相同代码/数据集的Highcharts代码在PHP中工作,但在JSfiddle中不起作用
- 博客代码数据:post.Url用作带有图像按钮的可点击链接