2017-02-21 88 views
0

我有对象数组即用户,我在async.each中使用async.parallel。现在,我没有在async.each中回复回复。我的代码如下:Async.parallel内部async.each不能正常工作

exports.addUserByCSV = function (req, res) { 


    var users = req.body; 
    async.each(users, 
    function (user, callback) { 
     var user = new User({ 
     username: user.email, 
     password: user.email.split('@')[0], 
     ipAddress: req.ip, 
     firstname: user.firstname, 
     lastname: user.lastname, 
     email: user.email, 
     employeeCode: user.employeeCode, 
     dateOfJoining: user.dateOfJoining, 
     dateOfAnniversary: user.dateOfAnniversary, 
     dateOfBirth: user.dateOfBirth, 
     employeeStatus: user.employeeStatus, 
     iw: user.iw, 
     fatherName: user.fatherName, 
     aliasName: user.aliasName, 
     aliasEmail: user.aliasEmail, 
     panNo: user.panNo, 
     gender: user.gender, 
     maritalStatus: user.maritalStatus, 
     biometricId: user.biometricId, 
     shift: user.shift, 
     nextApprisalDate: user.nextApprisalDate, 
     esiNo: user.esiNo, 
     pfNo: user.pfNo, 
     bankAccNo: user.bankAccNo, 
     situtation: user.situtation, 
     phone: user.phone, 
     mobile: user.mobile, 
     fax: user.fax, 
     website: user.website, 
     address: user.address, 
     city: user.city, 
     state: user.state, 
     zip: user.zip, 
     country: user.country 
     }); 
     userAdd(user, function (err, user) { 
     console.log(user) 
     callback(err); 
     }); 
    }, 
    function (err) { 
     res.send({ error: err, message: config.msg.SUCCESSFULLY_ADDED, user: 'User create Successfully' }); 
    } 
); 
    function userAdd(user) { 
    //console.log(user) 
    user.register(user, function (err, user) { 
     async.parallel({ 

     leave: function (callback) { 
      //add some leaves for user 
      _availLeaves(req.ID, user._id, function (err, leaves) { 
      callback(err, leaves); 
      }); 
     }, 
     salary: function (callback) { 
      //add salary structure for employee 
      _salaryStructure(req.ID, user._id, function (err, structure) { 
      callback(err, structure); 
      }); 
     } 
     }, function (err, results) { 
     console.log(results) 
     if (!err) { return results; } 

     res.send({ error: err, message: config.msg.SUCCESSFULLY_ADDED, user: 'User create Successfully' }); 

     }); 

    }); 
    } 

} 

function _salaryStructure(loginId, userId, cb) { 
    var structure = new Structure({ 
    userId: userId, 
    addedBy: loginId, 
    }); 
    structure.save(function (err, structure) { 
    cb(err, structure); 
    }); 
} 
function _availLeaves(loginId, userId, cb) { 
    var leave = new LeaveAvailable({ 
    "userId": userId, 
    "bl": 0.50, 
    "fl": 2, 
    "cl": 1, 
    "pl": (new Date().getDate() <= 15) ? 0.75 : 0 
    }); 

    leave.save(function (err, leaves) { 
    cb(err, 'leavesAdded') 
    }); 
} 

如果我写在async.parallelres.send然后,我就以下问题:

Error: Can't set headers after they are sent. 

如果我写在async.eachres.send然后我没有得到任何回应。

+0

我不知道这是否是一个错字,或者如果这是你的错误的来源,但功能你serAdd(user)'< - 回调在哪里?它应该是'功能userAdd(用户,回调){...' – slebetman

回答

0

问题是,您打电话给每个用户res.send,因此多次。相反,您可以将res.write(每次)res.end(所有用户都写完后)合并。

查看this了解更多详情。

所以你更新的代码看起来是这样的:

exports.addUserByCSV = function(req, res) { 


    var users=req.body; 
    async.each(users, 

    function(user, callback){ 
    var user = new User({ 
     username: user.email, 
     password: user.email.split('@')[0], 
     ipAddress: req.ip, 
     firstname: user.firstname, 
     lastname: user.lastname, 
     email: user.email, 
     employeeCode: user.employeeCode, 
     dateOfJoining:user.dateOfJoining, 
     dateOfAnniversary:user.dateOfAnniversary, 
     dateOfBirth:user.dateOfBirth, 
     employeeStatus: user.employeeStatus, 
     iw: user.iw, 
     fatherName:user.fatherName, 
     aliasName:user.aliasName, 
     aliasEmail:user.aliasEmail, 
     panNo:user.panNo, 
     gender:user.gender, 
     maritalStatus:user.maritalStatus, 
     biometricId:user.biometricId, 
     shift:user.shift, 
     nextApprisalDate:user.nextApprisalDate, 
     esiNo:user.esiNo, 
     pfNo:user.pfNo, 
     bankAccNo:user.bankAccNo, 
     situtation:user.situtation, 
     phone: user.phone, 
     mobile: user.mobile, 
     fax: user.fax, 
     website: user.website, 
     address: user.address, 
     city: user.city, 
     state: user.state, 
     zip: user.zip, 
     country: user.country 
    }); 

    userAdd(user,function(err,user){ 
       console.log(user) 
       callback(err); 
      }); 



    }, 

    function(err){ 
    if (!err) 
     res.end(); 
    //TODO: Handle error 

    } 
); 
function userAdd(user){ 
    //console.log(user) 
    user.register(user, function(err, user) { 
      async.parallel({ 

       leave:function(callback){ 
        //add some leaves for user 
        _availLeaves(req.ID,user._id,function(err,leaves){ 
          callback(err,leaves); 
        }); 
       }, 
       salary:function(callback){ 
        //add salary structure for employee 
        _salaryStructure(req.ID,user._id,function(err,structure){ 
         callback(err,structure); 
        }); 
       } 
      }, function(err, results) {  
       console.log(results)  
       if(!err){return results;} 

       res.write(JSON.stringify({error: err,message:config.msg.SUCCESSFULLY_ADDED,user:'User create Successfully'})); 

      }); 

    }); 
} 

    } 

    function _salaryStructure(loginId,userId,cb){ 
     var structure = new Structure({ 
      userId: userId, 
      addedBy: loginId, 
     }); 
     structure.save(function(err,structure){ 
      cb(err,structure); 
     });   
    } 
    function _availLeaves(loginId,userId,cb){ 
     var leave = new LeaveAvailable({ 
      "userId":userId, 
      "bl" : 0.50, 
      "fl" : 2,  
      "cl" : 1, 
      "pl" : (new Date().getDate()<=15)?0.75:0 
     }); 

     leave.save(function(err,leaves){ 
      cb(err,'leavesAdded') 
     }); 
    } 
+0

我已经尝试过这一点,我有以下错误在res.write: TypeError:第一个参数必须是一个字符串或缓冲区 在ServerResponse.OutgoingMessage.write _http_outgoing。js:456:11) – GsMalhotra

+0

对不起,忘记了字符串化,用JSON.stringify() – skymon

+0

更新了代码现在,数据发送到Db,请告诉我如何发送响应到客户端即res.send() – GsMalhotra

0

这是一个复杂的代码 - 这当然不是一个小例子来重现问题 - 所以让我给你,你可以用它来追踪的一般说明并解决您的问题。

async.parallelasync.each是非常不同的。使用parallel可以并行运行一组函数。通过each,您可以对集合中的每个元素应用单个迭代函数,也可以并行执行。

在上述每种情况下,您都需要确保每个函数都在某个时候调用其回调函数(无论是出错还是成功),否则整个操作将无法完成。

现在,每次操作发生后,您都需要调用res.send()方法一次

E.g.如果你有这样的事情:

async.each(collection, (element, cb) => { 
    // you should not return response here 
}, err => { 
    // you should return response here 
}); 

这是真的不管你在iteratee功能上面

参见: