2017-04-26 23 views
0

私のコードでエラーを見つけようとしていますが、他のトピックからのものはどれも適合しません。送信後にヘッダーを設定できません

Expressモジュールからget方法が含まapp.jsコードは、あり:で

exports.all = function (req, res) { 
    Notes.all(function(err, docs){ 
     if(err){ 
      console.log(err); 
      return res.sendStatus(500); 
     } 
     res.send(docs); 
    }) 
}; 

app.get('/notes', notesController.all); 

create方法をapp.jsへの輸出notesController.jsコード、ありますmodelこのコード:

​​

アプリケーションがクラッシュするこのエラー:コールバック関数で「コントローラ」と私の心で

process.nextTick(function() { throw err; }); 
          ^

Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11) at ServerResponse.header (O:\OGPI6\node_modules\express\lib\response.js:725:10) at ServerResponse.json (O:\OGPI6\node_modules\express\lib\response.js:253:10) at ServerResponse.send (O:\OGPI6\node_modules\express\lib\response.js:158:21) at O:\OGPI6\controllers\notes.js:9:13 at O:\OGPI6\models\notes.js:6:9 at handleCallback (O:\OGPI6\node_modules\mongodb\lib\utils.js:120:56) at O:\OGPI6\node_modules\mongodb\lib\cursor.js:860:16 at handleCallback (O:\OGPI6\node_modules\mongodb-core\lib\cursor.js:171:5) at setCursorDeadAndNotified (O:\OGPI6\node_modules\mongodb-core\lib\cursor.js:505:3)

のみエラー:

if(err){ 
      console.log(err); 
      return res.sendStatus(500); 
     } 
     res.send(docs); 

しかし、私はエラーが発生したときに、それが機能を終了し、sendStatus(500)を返しますが、伐採後にしなければならないと思いましたコンソールのエラーでres.send(docs)が返され、2番目のヘッダーが送信されているためアプリケーションがクラッシュします。それはうまく見えますが、うまくいきません。誰でも私が失敗した方法を指摘できますか?

+1

youtの 'exports.all'メソッドがコールバックを複数回起動している可能性があると思いますか?あなたは 'console.log'をコールバックの先頭に置こうとしましたか? –

+0

@BenjiLeesに同意します。コールバックが2回呼び出されているようです。 – robertklep

答えて

1

Expressは、さらにコードを実行する必要があり、このミドルウェアの目的が完了したことを知っていないと何もそこにあることを確認するためのミドルウェアで「次」パラメータを使用します。

exports.all = function (req, res, next) { 
    Notes.all(function(err, docs){ 
     if(err){ 
      console.log(err); 
      res.sendStatus(500); 
      return next(); 
     } 
     res.send(docs); 
    }) 
}; 

リターン後のコードの実行は、おそらく非同期性のためです。

elseブロックを使用することもできます。

exports.all = function (req, res, next) { 
     Notes.all(function(err, docs){ 
      if(err){ 
       console.log(err); 
       res.sendStatus(500); 

      } 
      else res.send(docs); 
     }) 
    }; 
+1

'next'は応答を返す可能性がある別のリクエストハンドラ(または最終的に"見つからなかった "ハンドラ)にExpressのパス制御をさせるかもしれないので、' next'を呼んで返すことはお勧めできません。 – robertklep

0

変更

if(err){ 
    console.log(err); 
    return res.status(500).send(err); 
} 
res.send(docs); 
にコード
関連する問題