2016-02-03 42 views
1

我創建了一個函數來將數據保存到下面的邏輯中的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.'); 
    } 

}; 

回答

1

只是爲了添加到什麼評論了你的問題@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.'); 
    } 

}; 
+0

優雅的代碼!我知道'map()',但是沒有足夠熟練地使用它,就像你在這裏做的那樣靈活。 此代碼不是Web服務器的一部分,它是由管理員在後臺運行以定期刷新數據。一旦數據刷新,數據庫連接應該關閉。 我將此標記爲解決方案 –

+0

@XiXiao謝謝。至少它的可讀性和您的使用情況,那麼您應該能夠適當地添加連接關閉邏輯。 – chridam

1

無需關閉連接。下面是一個已經大爲改善的版本:

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)

+0

你測試過了嗎?通過檢查,這行'saveQueue.push(factory.method(item));'會拋出一個錯誤,因爲factory不是一個對象,而是一個字符串(來自'factory = returnedArray [0] .type;') 。我相信你需要先創建工廠對象,或者只需要'saveQueue.push(工廠[factory] ​​.method(item));' – chridam

+1

@chridam是的,當然,謝謝! – Creynders

+1

感謝您分享您的想法!使用'工廠'肯定有幫助。我想知道它是否使代碼更易於傳遞實例而不是普通對象? –