2017-07-04 82 views
1

將第一個或第二個集合刪除的方法是正確的嗎?在貓鼬中級聯創建/刪除集合的好方法

我覺得這是第二個,但第一個更容易使用。是否可以使用承諾來簡化代碼的讀取?

第一種方式:

beforeEach((done) => { 
    //Before each test we empty the database 

    //Remove Roles 
    Role.remove({}, (err) => {}); 

    //Remove Users 
    User.remove({}, (err) => {}); 

    // Remove Workouts 
    Workout.remove({}, (err) => {}); 

    // Create user 
    Role.create({"name" : "Administrator"},(err, adminRole) => { 
     User.create({ firstname : "***", businessId: "1", lastname : "***", email : "***", roles:[adminRole]}, (err) => { 
      done();    
     }); 
    }); 
});` 

方式二:

beforeEach((done) => { 
    //Before each test we empty the database 

    //Remove Roles 
    Role.remove({}, (err) => { 
     //Remove Users 
     User.remove({}, (err) => { 
      // Remove Workouts 
      Workout.remove({}, (err) => { 
       // Create user 
       Role.create({"name" : "Administrator"},(err, adminRole) => { 
        User.create({ firstname : "***", businessId: "1", lastname : "***", email : "***", roles:[adminRole]}, (err) => { 
         done();    
        }); 
       }); 
      }); 
     }); 
    }); 
}); 

回答

2

第二個選項是最安全的,因爲如果一個錯誤的操作情況,接下來的人不被執行。

當然你應該使用承諾。代碼變得路除渣:

Role.remove({}) 
    .then(() => User.remove({}) 
    .then(() => Workout.remove({}) 
    .then(() => Role.create({"name" : "Administrator"}) 
    .then((adminRole) => User.create({ firstname : "***", businessId: "1", lastname : "***", email : "***", roles:[adminRole]}) 
    .then(() => done()) 
    .catch((error) => ...); 

爲了能夠使用的承諾,你可以設置貓鼬的promise是原生一個(只要您的節點版本爲> = 6):

mongoose.Promise = global.Promise; 
+0

謝謝Alberto。事實上,你對Promise的主張更性感:-)。第一個問題:如果User.remove({})失敗,則不會執行Workout.remove({})? –

+0

@oliviercherrier確實如此。如果'User.remove({})'失敗,它會直接跳到'catch' –

+0

第二個問題:如何使用第一種方式異步?從User.remove()結束或在User.remove結束之前是否可以執行Workout .remove是否執行? –