2016-04-11 10 views
0

mongooseを使用してユーザーの電子メールのリストを含むグループを検索するjavascript機能を使用しています。リストの各ユーザーを見つけて、古いグループ名の代わりに新しいグループ名を追加したいと思ったら、理由はわかりませんが、機能しません。forループを実行する前にグループに戻ります。ユーザーは変更されません。ここでMongoose、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); 
+0

'group.save'は、非同期操作、使用するコールバックまたはそこ約束です冒頭で

var async = require('async'); 

を忘れないでください。 – alexmac

+0

いいえ、私はいくつかの例を見つけようとしています – fandro

答えて

2

、私はあなたが私がしたかった方法を理解することを願っています解決する。

0

あなたが唯一のループの後user.save()を行う必要があります終了です。私はforループをforEachで更新しました。あなたは、コールバック問題

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); 
}); 

iは任意のミスを犯した場合、データなしでコードを書くことは常に困難である私を許して修正するために非同期を使用することができます

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!'}); 
    }   
}); 
+0

いいえ、申し訳ありませんが、ありがとう、それは動作していません – fandro

関連する問題