【问题标题】:Mongoose, can't update model with for loopMongoose,无法使用 for 循环更新模型
【发布时间】:2016-08-01 07:47:51
【问题描述】:

我正在使用 mongoose 做一个 javascript 函数来查找一个包含用户电子邮件列表的组,这部分工作得很好。在我想找到列表的每个用户并添加新组名而不是旧组名后,我不知道为什么,但它不起作用,函数在执行 for 循环之前返回我组,并且用户没有被修改。

这是我的用户模型:

var userSchema = mongoose.Schema({

    local            : {
        email        : String,
        password     : String,
    }
    groups           :  { type: [String], default: []}
});

这里是我的组模型:

var groupSchema = mongoose.Schema({

    title          : String,
    creator        : String,
    listOfUsers    : { type: [String], default: []}
});

这里是我的功能:

 Group.findOne({ '_id': groupId}, function (error, group){
                var oldTitle = group.title;
                group.title = req.body.title;
                group.save();
                if(error){
                    throw (error)
                }
                for(var i = 0; i < group.listOfUsers.length;i++){
                    User.findOne({'local.email': group.listOfUsers[i]}, function(error,user){
                        if(error){
                            throw (error)
                        }
                        for(var j=0;j<user.groups.length;j++){
                            if(user.groups[j] == oldTitle){
                                user.groups[j] = group.title;
                                user.save();
                            }
                        }
                    });
                }
                return res.json(group);

【问题讨论】:

  • group.save 是异步操作,在那里使用回调或承诺。
  • 好的,我正在找一些例子

标签: javascript node.js mongoose


【解决方案1】:

你可以使用异步来修复回调问题

async.waterfall(
[
  function (callback) {
        Group.findOne({
            '_id': groupId
        }, function (error, group) {
            if (error) {
                throw (error)
            } else {
                callback(null, group);
            }

        })

  },
function (group, callback) {


        for (var i = 0; i < group.listOfUsers.length; i++) {
            User.findOne({
                'local.email': group.listOfUsers[i]
            }, function (error, user) {
                if (error) {
                    throw (error)
                } else {
                    callback(null, user, group);
                }

            });
        }
},
function (user, group, callback) {
        var oldTitle = group.title;
        group.title = req.body.title;

        for (var j = 0; j < user.groups.length; j++) {
            if (user.groups[j] == oldTitle) {
                user.groups[j] = group.title;
                user.save();
            }
        }
        callback(null, 'done');
}
],
function (err, result) {
    console.info("4");
    console.info(err);
    console.info(result);
});

如果我犯了任何错误,请原谅我,没有数据的代码总是很难写,我希望你能理解我想如何解决。

别忘了

var async = require('async');

开头

【讨论】:

    【解决方案2】:

    你应该只在 for 循环完成后执行user.save()。我用forEach 更新了for 循环,我觉得使用起来更舒服。

    Group.findbyId(groupId, function(err, group) {
        var oldTitle = group.title;
        group.title = req.body.title;
        if (group.save()) {
            listOfUsers.forEach(function(groupUser) {
                User.findOne({'local.email' : groupUser}, function (err, user) {
                    if(user) {
                        user.group.forEach(function(userGroup) {
                        if (userGroup == oldTitle) {
                            userGroup = group.title;
                        }
                    })
                    user.save();
                    }
                });
            });
            res.json(group);
        } else {
            res.status(400).json({messsage: 'Error while saving group!'});
        }        
    });
    

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 2015-01-19
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2011-06-28
      • 1970-01-01
      相关资源
      最近更新 更多