Express / MongoDB – 数据库操作期间的意外行为

我有一个用户列表,我试图存储/更新到我的mongoDB数据库。 但是只有我列表中的最后一个元素被考虑在内,其他用户则不能进入thenfunction。

我是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 

这个问题与JavaScriptclosures有关。 当你添加一个函数到函数队列时,它和它的variables被添加。 在这种情况下,variablesuser被添加。 当函数终止并调用updateUser()函数时, uservariables是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); } });