Javascript 使用mongoose保存阵列数据的更干净的代码
我创建了一个函数,用下面的逻辑将数据保存到mongoDB中,但我真的很难重构代码并使其更干净,有这么多烦人的代码重复,我怎么能有枯燥的原则呢 逻辑: 1.传入一个标志以决定是否关闭DB连接。 2.根据传入的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,
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谢谢至少它是可读的,并且对于您的用例,您应该能够适当地添加连接关闭逻辑。