我有这个辅助功能:
const Account = require('../models/account');
exports.sendInvites = (accountIds, invite, callback) => {
if (!accountIds) {
callback('No account ids provided', null, null);
return;
}
accountIds.forEach((id) => {
Account.findOneAndUpdate({_id: id}, {$push: {organisationInvites: invite}}, callback);
});
};
然后我有这条路:
router.post('/organisations', auth.verifyToken, (req, res, next) => {
const organisation = new Organisation({
name: req.body.name,
email: req.body.email,
admins: [req.body.createdBy],
createdBy: req.body.createdBy
});
organisation.save((err, organisation) => {
if (err) {
return res.status(500).json({
error: err,
data: null
});
}
organisationUtils.sendInvites(req.body.invites, {
inviter: req.body.createdBy,
organisation: organisation._id
}, (err, account, response) => {
if (err) {
return res.status(500).json({
error: err,
data: null
});
}
res.json({
error: null,
data: organisation
});
});
});
});
我的
出现Error: Can't set headers after they are sent.
错误
res.json({
error: null,
data: organisation
});
部分,但我不明白为什么会这样。我试着在Error: Can't set headers after they are sent to the client查看接受的答案,进行了一些挖掘,但是在上面我的特定例子中仍未找到任何具体原因。有什么想法吗?
答案 0 :(得分:2)
您多次调用回调,因此多次调用res.json
。从所有数据库请求中收集数据,然后执行唯一的res.json
。
accountIds.forEach((id) => {
Account.findOneAndUpdate(
{_id: id},
{$push: {organisationInvites: invite}},
callback,
);
});
类似的东西:
var allData = [];
var nbRequestDone = 0;
var waitAllCallback = function (data, err) {
if (err) {
callback(err);
nbRequestDone = accountIds.length;
return;
}
nbRequestDone += 1;
allData.push(data);
if (nbRequestDone === accountIds.length) {
callback(false, allData);
}
};
accountIds.forEach((id) => {
Account.findOneAndUpdate(..., waitAllCallback);
});
答案 1 :(得分:0)
此视频介绍了有关“错误:发送标头后无法设置标头”的错误。 https://www.youtube.com/watch?v=rKTlakY8j2M
在视频摘要中,当您的代码中有一个额外的回调时,将显示此错误。希望这可以帮助。也一直在为此挣扎一段时间。