Express / MongoDB - 数据库操作期间出现意外行为

时间:2016-06-23 10:44:19

标签: node.js mongodb express asynchronous callback

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

1 个答案:

答案 0 :(得分: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);
    }
});