我有一个用户列表,我尝试将其存储/更新到我的 mongoDB 数据库中。
但仅考虑列表中的最后一个元素,其他用户不会进入 then
函数。
我是 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
最佳答案
问题与 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);
}
});
关于node.js - Express/MongoDB - 数据库操作期间的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37989376/