gpt4 book ai didi

node.js - Express/MongoDB - 数据库操作期间的意外行为

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:18 25 4
gpt4 key购买 nike

我有一个用户列表,我尝试将其存储/更新到我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com