3

2 つのミドルウェアがある場合、最初にヒットするものを追加し、リクエストを渡すミドルウェアを決定するにはどうすればよいでしょうか。リクエストは、ミドルウェアの 1 つにのみドロップまたは転送できます。両方にはできません。

app.use( function *(next) {
    if (isAuthenticated)
        *private middleware*
    else
        *use public middleware*
});

より具体的には、ユーザーがログインしているかどうかに応じて応答が変化
するホームページがあります(ここではトークンベースの認証を使用しています)。/簡単にするために、リクエスト ユーザーがトークンを持っていない場合は、リクエストが有効なトークンを保持しているpublic.html間のレスポンスです。 これは 1 つの関数内に実装するだけで十分簡単ですが、ルーターを分離したいと思います。これにより、コードがより管理しやすくなります。 それで、リクエストがどのミドルウェアルーターに正しく送られるかをどうにかして選択できるようにする必要がありますか? それを行う方法がわかりません。private.html

var publicR = new router();
publicR.get('/', function *(next) {
    ....public.html....
});
var privateR = new router();
privateR.get('/', function *(next) {
    ....private.html....
});

app.use(function(){
   if(isAuthenticated)
      ...use privateR.routes();
   else
      ...use publicR.routes();
});
4

2 に答える 2

3

まず、ログインしている場合とログインしていない場合で、特定の URL に対してまったく異なるコンテンツを表示することは珍しく、実際には良い考えではありません。ユーザーとログインしていないユーザーのもう一方は、おそらく良い設計アイデアではありません。

より一般的なケースは、ログイン時に異なる可能性があるページの一部を持つことです。その場合、ログイン時と非ログイン時のコンテンツでわずかに異なる処理を行うページを作成する単一のルートがあります。

ログイン時に完全に異なるコンテンツと動作が本当に必要な場合は、おそらくログイン時に別の URL にリダイレクトする必要があります。その場合、「ログイン」URL にまったく異なるルーターを使用できます。これは、特定の URL が一貫したコンテンツを報告し、ユーザーの状態によって異なることはないため、検索エンジンにも適しています。これにより、Express でのルーターの使用も非常に簡単になります。「ログインした」ルーターは、ログインした URL を提供します。ログインした URL をチェックして実際にログインしているかどうかを確認し、ログインしていない場合はログインしていないページにリダイレクトするミドルウェアを使用できます。

于 2016-02-15T07:12:49.650 に答える
1

他の誰かがこの問題に遭遇した場合、これは私のために働いています:

var publicR = new router();
publicR.get('/', function *(next) {
    ....public.html....
});
var privateR = new router();
privateR.get('/', function *(next) {
    ....private.html....
});

app.use(mySwitcher);


function *mySwitcher(next){
   if(isAuthenticated)
      yield privateR.routes().call(this,next);
   else
      yield publicR.routes().call(this,next);
}
于 2016-02-15T04:59:38.590 に答える