Async.parallel内部async.each不能正常工作
我有对象数组即用户,我在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.parallel
res.send
然后,我就以下问题:
Error: Can't set headers after they are sent.
如果我写在async.each
res.send
然后我没有得到任何回应。
问题是,您打电话给每个用户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')
});
}
我已经尝试过这一点,我有以下错误在res.write: TypeError:第一个参数必须是一个字符串或缓冲区 在ServerResponse.OutgoingMessage.write _http_outgoing。js:456:11) – GsMalhotra
对不起,忘记了字符串化,用JSON.stringify() – skymon
更新了代码现在,数据发送到Db,请告诉我如何发送响应到客户端即res.send() – GsMalhotra
这是一个复杂的代码 - 这当然不是一个小例子来重现问题 - 所以让我给你,你可以用它来追踪的一般说明并解决您的问题。
async.parallel
和async.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功能上面
参见:
我不知道这是否是一个错字,或者如果这是你的错误的来源,但功能你serAdd(user)' slebetman