2015-11-10 9 views
5

https://github.com/hwz/chirp/blob/master/module-5/completed/routes/api.jsリターン

function isAuthenticated (req, res, next) { 
    // if user is authenticated in the session, call the next() to call the next request handler 
    // Passport adds this method to request object. A middleware is allowed to add properties to 
    // request and response objects 

    //allow all get request methods 
    if(req.method === "GET"){ 
     return next(); 
    } 
    if (req.isAuthenticated()){ 
     return next(); 
    } 

    // if the user is not authenticated then redirect him to the login page 
    return res.redirect('/#login'); 
}; 

なぜ著者はreturn next()代わりのnext()をするのでしょうか?私はnext()は、次のミドルウェアや機能にジャンプすることができますが、それはなぜ上記のnext()のために必要ですか?

+0

だから 'isAuthenticated'は' next() 'が返すものを返します。これは有用な価値ではないかもしれません。 –

+2

可能な複製http://stackoverflow.com/questions/16810449/when-to-use-next-and-return-next-in-node-js有効であり、良い質問 –

+0

エクスプレスミドルウェアの文脈では特定のミドルウェアを実行することを停止するかどうかは、それらのifステートメントのいずれかに当てはまります。 'next'を呼び出すと明示的に「ここでやりました」と言われますが、' next'と呼ぶことができる 'return'がなくてもリダイレクトを試みます。 – ste2425

答えて

1

この機能を終了するには、returnの前に付けるのが一般的です。代わりに、ifの代わりにif-else if-elseを使用することもできます。この場合、関数を終了してミドルウェアチェーンをさらに進めたいだけです。

このパターンはかなり頻繁に表示されます。たとえば、これはかなり一般的です:

someFunction(function(err, result) { 
    if (err) { 
     return console.error(err); 
    } 

    console.log(result); 
}); 

それは以下のネストだとこれに比べて最もpoepleに簡単に読み取ります

someFunction(function(err, result) { 
    if (err) { 
     console.error(err); 
    } else { 
     console.log(result); 
    } 
}); 

最初のパターンはまた、誤って二回あるいは複数回next()を呼び出すからあなたを保ちますあなたのif-else -logicに何らかのエラーがある場合に備えてください。 あなたが掲示したその場合、それはnext()で起こるはずのことではありません。next()を呼び出しても、いずれの場合でもリダイレクトが発生する可能性があります。

+0

これは質問に答えるものですか?私はnext()が何をしているのか知っていますが、なぜnext()を返すのですか、それは私の質問です –

+0

これはまさに私が私の答えで説明していることです。それ以降の呼び出しを避けるために、その時点でメソッドを終了するだけです。それはパターンです。本当に 'next()'とは関係ありません。これは主に_callback hell_の性質によるものです。 –