2017-11-16 14 views
2

に送られた後、ヘッダーを設定することはできません私はこのヘルパー関数を得た:NodeJS/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.エラーが発生します

部分ですが、なぜこれが起こっているのか理解できません。私はここで受け入れられた答えを見てみましたError: Can't set headers after they are sent to the client、いくつかの掘り出しても、上記の私の特定の例で何が起こっているのか特定の理由を見つけることができませんでした。何か案は?

+0

。 –

+0

実際にコールバックを複数回使用する場合は、非同期ライブラリを使用します。 '' https:// caolan.github.io/async/docs.html''' –

答えて

2

コールバックを複数回コールしています。したがって、res.jsonを複数回呼び出しています。すべてのデータベース要求からデータを収集し、ユニークなres.jsonを実行します。

accountIds.forEach((id) => { 
    Account.findOneAndUpdate(
           {_id: id}, 
           {$push: {organisationInvites: invite}}, 
           callback, 
          ); 
}); 

ような何か:すべてのDB操作が完了した後に呼ばれなければなりませんあなたはloop.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); 
    }); 
+0

私はそれを試してもうまくいきますが、リクエストがクライアント側に返されないことがあります。それがなぜなのか? – Chrillewoodz

+0

エラーが返されたかどうか確認しましたか? (最初のパラメータ) –

+1

私はそれを解決したと思います。時間の半分に失敗した状態チェックがありました。理由は不明です。ありがとう。 – Chrillewoodz