2016-06-23 33 views
1

我有一個用戶列表,我試圖存儲/更新到我的mongoDB數據庫中。 但是隻有我列表中的最後一個元素被考慮在內,其他用戶不會輸入then函數。Express/MongoDB - 數據庫操作期間的意外行爲

我是Nodejs的新手,這似乎是由於我不明白的同步行爲。

var User = require('../to/path/user-service'); 
.... 
userList.forEach(function(user) { 
    try { 
      User.updateUser(user); 
    } catch(err) { 
     return console.error(err); 
    } 

}); 

用戶服務

... 
var User = mongoose.model('User', userSchema); 
console.log(user.name);  
export.updateUser = function (user) { 
    Issue.findOne({name: user.name}) 
     .then((user) => { 
      if(user) console.log(user.name + ' has been updated'); 
      else console.log(user.name + ' has been created'); 
    }).catch((err) => console.error(err)); 
}; 

輸出繼電器

John 
Paul 
Alex 
Alex has been created 
Alex has been created 
Alex has been created 

回答

2

的問題與JavaScript的閉包做。在函數隊列中添加一個函數時,會添加它和它的變量。在這種情況下,添加變量user。當函數終止並調用updateUser()函數時,user變量是Alex,所以Alex被添加了三次。瞭解更多關於關閉位置:https://developer.mozilla.org/en/docs/Web/JavaScript/Closures

這是解決您的問題的一種方法:

userList.forEach(function(user) { 
    var closureUser = user; 
    try { 
      console.log(closureUser.name);  
      closureUser.updateUser(closureUser); 
    } catch(err) { 
     return console.error(err); 
    } 
}); 
+1

我加了你的修改,但我仍然有同樣的問題。 – Jils

+0

我的真實代碼稍有不同。考慮到封閉機制,我終於有了我所期望的。謝謝 – Jils