2016-06-23 13 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は3回加算されます。ここで閉鎖について詳しく読む:ここ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

関連する問題