2016-12-02 3 views
0

エラーの場合にミドルウェアチェーンを正しく終了するにはどうすればよいですか?私のコードでミドルウェアチェーンを停止する方法は?

私は

if (someProblem) { 
     res.status(statuscode).json({message: 'oops'}); 
     return; 
    } 

を持っているしかし、その後チェーンにおけるミドルウェアは私Can't set headers after they are sentエラーを与えると呼ばれる取得保持します。

+1

あなたが次の電話をした場合にのみチェーンが起こります。それ以外の場合は停止します – Simon

+0

あなたは正しいです。ありがとうございます – Lev

答えて

1

ミドルウェアは単独では動作しません。 next()を呼び出さない限り、next()に電話するとチェーンの次のステップに進むだけで、次のステップは実行されません。

したがって、応答を返して(next()を呼び出さずに)返信すると問題は発生しません。

あなたの質問に表示されたコードは、あなた自身が参照しているエラーメッセージを引き起こすわけではありませんので、そのエラーが発生していることを私たちに示していないことがさらに必要です。

+0

メモリにはどうなりますか?それは漏れるだろうか? – AiShiguang

+0

@AiShiguang - メモリに関する問題はありません。応答を送信すると、http接続が終了して閉じます。リクエストハンドラは関数参照の静的な配列であり、チェーン内の次のものを見つけるために 'next()'が呼ばれたときに参照されます。これらの関数の一部をスキップしても、メモリの使用状況は変わりません。 – jfriend00

0

ミドルウェアがチェーンの次のステップに行かず、エラーを返すには、next(error)コールバックに電話する必要があります。

これは、エラーハンドラミドルウェアを呼び出し、エラーが発生した場合にそのエラーを処理してクライアントに返します。カスタムエラーハンドラミドルウェアを実装するために

あなたはあなたは単にあなたが実際のサーバーインスタンスを作成する前に(4つのパラメータをとる関数である)のErrorHandlerを添付する必要がありhandleError(err, req, res, next)(error, req, res, next)

0

を使用することができます。どこでもあなたは今、単にvar newError = new Error('my error message');でエラーを作成し、エラーがスローされた後に実行を停止するにはnext(newError);nextコールバックに渡し、応答を送信しないようにすることができ、アプリ内

二回使用 return next (newError);

// example route 
app.get('/test', function(req, res, next){ 
    if (someProblem) { 
    var newError = new Error('oops'); 
    return next(newError); 
    } 
    res.send('all OK - no errors'); 
}); 

// attach this errorHandler just before you create the server 
app.use(function(error, req, res, next){ 
    console.log(error); 
    res.status(500).json(error); 
}); 

// this is where you create the server 
var server = app.listen(4000, function(){ 
console.log('server started'); 
}); 
関連する問題