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

标签 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

最佳答案

问题与 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/

相关文章:

javascript - 如何根据 Electron 窗口内 HTML 元素的宽度调整 Electron 窗口的宽度?

java - mongodb java 驱动程序 3.0 : how to store JSON document

sql - 从 sql server 迁移到 cassandra

javascript - 服务前处理 Cookie

javascript - node.js - 我应该如何组织我的代码?我现在得到的并不可靠

node.js - 用于 Raspberry Pi ARM 的 Mongodb MongoClient.connect() 上的总线错误

node.js - NodeJS子进程stdout都是数字

node.js - 通过 Node.js 驱动程序运行任意 MongoDB 脚本

node.js - 在Node/Express中重用大型翻译文件的最佳方法

express - less 中的 @import 目录语句