NodeJS / MongoDB - 错误:发送后无法设置标头

时间:2017-11-16 13:13:08

标签: node.js mongodb

我有这个辅助功能:

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查看接受的答案,进行了一些挖掘,但是在上面我的特定例子中仍未找到任何具体原因。有什么想法吗?

2 个答案:

答案 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

在视频摘要中,当您的代码中有一个额外的回调时,将显示此错误。希望这可以帮助。也一直在为此挣扎一段时间。