我无法使用简单的for循环,因为request.save是一个函数。所以我试着为每个人。它完美无缺!直到我添加request.save部分,我收到以下错误消息,打破了我的应用程序。
错误:发送后无法设置标头。
exports.submit = function (req, res) {
Person.find({
cellPhone: req.body.phone
}).exec(function (err, people) {
people.forEach(saveRequest);
}
function saveRequest(item, index) {
var request = new Requests();
request.start = req.body.start.value;
request.finish = req.body.finish.value;
request.phone = req.body.phone;
request.offDay = req.body.date;
request.user = people[index]._id;
request.name = people[index].name;
request.group = people[index].group;
request.save(function (err) {
if (err) {
console.log('request.save');
return res.status(400);
} else {
// Remove sensitive data before login
//user.password = undefined;
//user.salt = undefined;
console.log(request);
res.json(request);
}
});
}
});
答案 0 :(得分:1)
问题是当您执行 .save()时,您传递了一个匿名函数,以便在出错时完成响应。
所以你完成了第一个保存事件错误。
您应该在保存回调之外完成响应。
可能会使用事件来同步您的代码,或者更好地使用生成器。
在你的forEach循环之前:
let savedResponses = [];
let savedErrors = [];
...
然后你的savedRequest:
function saveRequest(item, index) {
var request = new Requests();
request.start = req.body.start.value;
request.finish = req.body.finish.value;
request.phone = req.body.phone;
request.offDay = req.body.date;
request.user = people[index]._id;
request.name = people[index].name;
request.group = people[index].group;
request.save(function (err) {
if (err) {
console.log('request.save error');
savedErrors.push(err);
// return res.status(400);
} else {
// Remove sensitive data before login
//user.password = undefined;
//user.salt = undefined;
console.log(request);
savedResponses.push(request);
}
});
}
然后在forEach循环之后,您应该等待 .save()回调中异步人员的结束。
您可以使用事件包或生成器或承诺模式。
取决于您的节点版本。
当你同步代码时,你可以先完成你的响应检查错误:
if (savedErrors.length > 0) {
res.status = 400;
// ... report errors
}
或者只是使用 savedResponses 完成回复。