2016-06-30 11 views
0

ノードjsアプリケーションと、「送信後にヘッダーを設定できません」と表示されるルートの1つがあります。送信後にヘッダーを設定できません - NodeJS

ルートが何:私のアプリで

ユーザーが特定のアクセスレベルを持っているので、このルートは、ユーザーaccessLevel配列を通過し、このルートのための適切なアクセスレベルを検出します。そして、ルートを呼んでいるユーザのアクセスレベルに基づいて、それは異なる動作を実行する。

コード:

app.post('/bios/approve', isLoggedIn, function(req, res) { 

for (var i = 0; i < req.user.accessLevel.length; i++) { 
    if (req.user.accessLevel[i] === "Bio Officer") { 

     Bio.findOneAndUpdate({userID: req.body.userID, bioForSector: req.body.bioForSector}, { 
      background: req.body.background, 
      experience: req.body.experience, 
      skills: req.body.skills, 
      bioStatus: req.body.bioStatus 
     }, function(err, editedBio) { 

      if (err) 
       console.log("Error while editing Pending Bio is " + err); 

      else if (editedBio) { 
       User.findOneAndUpdate({accessLevel: "Bio Designer"}, { 
        $push: {biosPending: editedBio._id} 
       }, function(err, user) { 

        if (err) { 
         console.log("The error while finding lineManager is " + err); 
        } else if (user) {User.findOneAndUpdate({accessLevel: "Bio Officer"}, { 
          $pull: { 
           biosPending: editedBio._id 
          } 
         }, function(err, bioOfficer) { 
          if (err) { 
           console.log("The error while finding lineManager is " + err); 
          } 
          res.json("Bio Done!") 
         }); 

        } 
       }); 

      } 

     }); 

    } else if (req.user.accessLevel[i] === "Bio Designer") { 
     // Currently Empty 

    } else { 

     Bio.findOneAndUpdate({userID: req.body.userID,bioForSector: req.body.bioForSector}, { 
      background: req.body.background, 
      experience: req.body.experience, 
      skills: req.body.skills, 
      bioStatus: req.body.bioStatus 
     }, function(err, editedBio) { 

      if (err) 
       console.log("Error while editing Pending Bio is " + err); 

      else if (editedBio) { 
       User.findOneAndUpdate({accessLevel: "Bio Officer"}, {$push: {biosPending: editedBio._id} 
       }, function(err, user) { 

        if (err) { 
         console.log("The error while finding lineManager is " + err); 
        } else if (user) { 

         User.findOneAndUpdate({email: editedBio.lineManagerEmail}, {$pull: {biosPending: editedBio._id} 
         }, function(err, bioOfficer) { 

          if (err) { 
           console.log("The error while finding lineManager is " + err); 
          } 
          res.json("bio Done!") 
         }); 

        } 
       }); 

      } 
     }); 
    } 
} 
}); 

すべてのヘルプは大歓迎されます。誰かが私が間違っていることを知っていますか?

+0

あなたは明確なことはできますか?それはほとんど読むことができません... – CreasolDev

+0

あなたのisLoggedIn関数をクロスチェックして、そこにresを送信していません – Nivesh

答えて

0

最初にres.End();を追加してください。 res.json()の後に。 これでうまくいかない場合は、「isLoggedIn」のコードを追加してください。

1
Can't Set Headers After they are sent 

は、1回のリクエストで複数回応答を送信していることを意味します。

あなたから私が提案することができますどのようなコードです:

for (var i = 0; i < req.user.accessLevel.length; i++) { 
    if(--req.user.accessLevel.length == 0){ 
     res.json("Bio Done!") 
    } 
} 
+0

答えをありがとう。 accessLevelの長さは決して0にはなりません。すべてのユーザーは少なくとも1つのaccessLevelを持ちます。私はコード内でres.jsonを2回持っていますが、 'if'ステートメントのさまざまな部分にあります。 – Skywalker

0

あなたはあまりにもreturn単語を使用する必要があります応答を返送するたびに。 あなたは、行が実行された後にコードがないことを確認し、誤って別の応答を再度送信したいと思っています。

例えば:最初にそのCBの地獄アウトreturn res.json("bio Done!")

関連する問題