2016-05-03 18 views
-1

res.redirect()で引数を送信します。しかし、実行中にエラーが発生し、送信後にヘッダーを設定できないと言っています。エラー:送信後にヘッダーを設定できません

これはどういう意味ですか、どうすれば修正できますか?

app.post('/updateCollaborateRequest', function(req,res) { 
    if(req.body.accept == true) { 
     Team.findOne({'name': req.body.data.teamName}, function (err, team) { 
      if(err) { 
       res.redirect('/explore'); 
      } 
      team.accepted = true; 
      team.save(function (err) { 
       if (err) { 
        alert(err); 
       } 
       Request.findOne({'emailAdmin': req.session.email}, function(err, request) { 
        request.seen = true; 
        request.save(function(err) { 
         if(err) { 
          console.log(err); 
         } 
        }); 
       }); 
       res.redirect("/teamprof/" + team.name); 
      }); 
     }); 
    } 
    Request.findOne({'emailAdmin': req.session.email}, function(err, request) { 
     request.seen = true; 
     request.save(function(err) { 
      if(err) { 
       console.log(err); 
      } 
      res.render('userprof1', {message : req.flash('done')}); 
     }); 
    }); 
}); 
+0

編集されたこの投稿の_really_受け入れられない嘆願のほかに、私は未解決のまま残っている以下の2つの答えがあることに気付きます。その時にどちらかがあなたを助けてくれましたか?私はあなたが[今日もまた投稿しました](https://stackoverflow.com/questions/46894865/how-to-identify-the-encoding-charset-of-a-file-in-java)を見ました - 私に許可してくださいあなたが受け取った有益な回答とやりとりすることをお勧めします。このサイトは、地域社会の精神、そしてそのゲーミングに基づいて成功または失敗すると考える価値があります。 – halfer

+0

こんにちは、私は質問をするためにフォーラムを使用する方法をお詫び申し上げます。私は確かにstackoverflowで質問する方法の事実を認識していない、次回にそれらを心に留めようとするでしょう。そして、私の知る限りでは、答えのどちらもこの質問に関して私を助けませんでした。それは長い時間でしたので、正しい解決策が当時どのようなものか分かりませんでした。 –

+0

まあ、OK。私はここではっきりと述べる危険にさらされているかもしれませんが、彼らはあなたを助けようとしました。彼らとやりとりしたり、返信したり、努力してアップヴォートするのは普通のことです。私はこれがスタックオーバーフローに特に関係しているとは思わない - 普通の人間のやりとりの感謝の表情ではない? – halfer

答えて

1

コードはリダイレクト後も引き続き表示されます。それはおそらく問題です。あなたは戻ってください、そうでなければ、あなたはHTTP応答に書き込もうとし続けます。

1

この特定のエラーメッセージは、応答を複数回送信しようとする複数のres.xxx()呼び出しを引き起こすコードパスによって発生します。

あなたはあなたがそれをやり遂げる場所を複数持っています。たとえば、Team.findOne()コールバック内に2つのres.redirect()コールがありますが、res.render()があるRequest.findOne()に進みます。応答を一度だけ送信するようにしてください。

私は、所望の論理は、すべてのケースであるか全くわからないんだけど、あなたはRequest.findOne()else文を追加し、各res.redirect()returnを追加することによって、そのエラーを修正することができます。これが正確なフローではない場合は、コントロールフローをどのように機能させるかについてもっと詳しく説明してください。ここで適用され、それらの変更とのコードは次のとおりです。

app.post('/updateCollaborateRequest', function(req,res) { 
    if(req.body.accept == true) { 
     Team.findOne({'name': req.body.data.teamName}, function (err, team) { 
      if(err) { 
       res.redirect('/explore'); 
       return; 
      } 
      team.accepted = true; 
      team.save(function (err) { 
       if (err) { 
        // FIXME: need error handling here 
        alert(err); 
       } 
       Request.findOne({'emailAdmin': req.session.email}, function(err, request) { 
        request.seen = true; 
        request.save(function(err) { 
         if(err) { 
          // FIXME: need error handling here 
          console.log(err); 
         } 
        }); 
       }); 
       // Are you sure you want to send this response before 
       // you even know if the `Request.findOne()` and `request.save()` 
       // have been sucessful? 
       res.redirect("/teamprof/" + team.name); 
       return; 
      }); 
     }); 
    } else { 
     Request.findOne({'emailAdmin': req.session.email}, function(err, request) { 
      request.seen = true; 
      request.save(function(err) { 
       if(err) { 
        console.log(err); 
       } 
       res.render('userprof1', {message : req.flash('done')}); 
      }); 
     }); 
    } 
});  

あなたはまだ何も応答があまりにも固定されるので、それらの必要性を扱う不完全なエラーである送らされていないため、いくつかのエラー条件を持っています。そして、私はコード内にいくつかの疑わしい事柄についていくつかのコメントを追加しました。

関連する問題