57

ログインが失敗した場合に早期に終了したいログインコンポーネントを備えたかなり単純な Express.js アプリがあります。res.send()アプリがそれを行っていないという兆候が見られますが、呼び出しによってそれ以上の処理が停止するかどうかを示す決定的な答えは見つかりませんでした。現在の私のコードは次のとおりです。

client.login( username, password, function( auth, client ) {
  if( !auth ) {
    res.send( 401 );
  }

  // DO OTHER STUFF IF AUTH IS SUCCESSFUL
}

ソースコードを正しく読めば、リクエストは終了するはずですが (それ以上の処理は中止されます)、私はノードを初めて使用するので、読んでいるものを信頼する準備ができていません。要約すると、私は主に、なじみのないソース コードの私自身の解釈について、より信頼できる情報源からの決定的な答えを探していると思います。処理を中止しない場合send()、それを行う正しい方法は何ですか?

4

7 に答える 7

69

もちろん、Express は魔法のように JavaScript 関数の実行を別の場所から停止させることはできません。

next([error]) ソリューションは好きではありません。なぜなら、エラーは通常予期しない状況 (データベースに到達できないなど) にのみ使用する必要があると思うからです。この場合、単純な間違ったパスワードでエラーが発生します。通常の制御フローに例外/エラーを使用しないことは、一般的な規則です。

したがって、 res.send 呼び出しの後に return ステートメントを配置して、関数の実行を停止することをお勧めします。

client.login( username, password, function( auth, client ) {
  if( !auth ) {
    res.send( 401 );
    return;
  }

  // DO OTHER STUFF REALLY ONLY IF AUTH IS SUCCESSFUL
}
于 2013-10-11T07:15:57.917 に答える
43

フレームワークとしてexpressを使用している場合は、代わりにnext()を呼び出す必要があります。

reqExpressの各ハンドラーは、、resおよびである3つのパラメーター(基本httpの場合はリンク解除2)を受け取ります。next

next引数なしで呼び出されると、ミドルウェアチェーンの次のハンドラーをトリガーする関数です。

が引数とともに呼び出された場合next、その引数のタイプに関係なく、この引数はエラーとして解釈されます。

その署名はnext([error])です。nextがエラーで呼び出されると、ミドルウェアチェーン内の次のハンドラーを呼び出す代わりに、エラーハンドラーを呼び出します。そのエラーハンドラで401応答コードを処理する必要があります。Expressでのエラー処理の詳細については、これを参照してください

編集:@Baptiste Costaがコメントしたように、単に呼び出すだけでは現在の実行が停止することはありませんが、次のミドルウェアが呼び出されnext()ますreturn next()代わりに、Nodeがエラー(--errorなど)をスローしないようにするために使用することをお勧めしcan't set headers after they are sentます。これには、一般的なエラースローの上記の提案が含まれます。

return next(new Error([error]));
于 2013-02-05T15:36:17.403 に答える
-7

「else」ブロックの使用を誰も提案しないのはなぜですか?

if(!auth){
    // Auth fail code
    res.send 'Fail'
} else {
    // Auth pass code
    res.send 'Pass'
}

'next' は、"app.use(function(req, res, next));" 用の独自のミドルウェアを作成するときに使用されます。「app.get(route, function(req, res));」のようにルートを設定している場合 次に、関数内のコードは、「次へ」を使用する必要なく、指定しているコードを持つことができる場所です。

于 2013-12-03T14:07:20.087 に答える