节点js因多次更新而崩溃(mongoose)

时间:2015-11-18 12:03:57

标签: node.js mongodb mongoose

我在控制器中使用此代码更新数据库中的一个或多个项目。

 update: function(req, res) {

       var ids = new Array();

        for(var i =0;i<req.body.data.length;i++){
          ids.push(req.body.data[i]._id);   
        }

       ids.forEach(function (id,index) {

          dayModel.findOne({_id: id}, function(err, day){
              if(err) {
                  console.log("error");
              }
              if(day) {

                  day.worker =  req.body.data[index].lav_mail ? 
                                    req.body.data[index].lav_mail : day.worker;
                  day.date =  req.body.data[index].date ? 
                                    req.body.data[index].date : day.date;
                  day.hours =  req.body.data[index].ore ? 
                                    req.body.data[index].ore : day.hours;
                  day.project =  req.body.data[index].progetto ? 
                                    req.body.data[index].progetto : day.project;
                  day.activity =  req.body.data[index].attività ? 
                                    req.body.data[index].attività : day.activity;
                  try {
                  day.save(function(err, day){

                      //return res.json(day);
                  });
                }catch(ex){
                  console.log(ex.stack);
                }
              }
          });    
       });

}

然后在路由器

router.put('/', function(req, res) {
  dayController.update(req, res);
});

当用户拨打大量电话时,NodeJS会崩溃。

你有什么建议吗?

1 个答案:

答案 0 :(得分:1)

虽然您可以使用async模块,但有一种方法可以使用它。 以下代码将一个接一个地更新一条记录,完成后将返回一系列天数。

 update: function(req, res) {    
     var days = [];

     updateOne();

     function updateOne(){
         // get one data object from array
         var data = req.body.data.pop();
         dayModel.findOne({_id: data.id}, function(err, day){
             if(err) {
                 console.log("error");
             }
             if(day) {

                 ...

                 day.save(function(err, day){
                     days.push(day); 
                     // if no more data then return   
                     if(!req.body.data.lenght) return res.json(days);
                     // otherwise update another one
                     updateOne();
                 });
             }
        });
    }
}