/ loginを除くすべてのルートをキャッチ


83

私は現在、ユーザーが各リクエストのヘッダーで認証トークンを渡すことを要求するAPIを作成しています。今、私はキャッチオールルートを作成できることを知っています

app.get('/*', function(req,res){

});

しかし、/loginまたはなどの特定のルートを除外するようにするにはどうすればよいの/でしょうか。


たとえば、/ login/ registerを除く すべてのルートで認証を要求します。(人々はなぜあなたがこの質問をしたのか疑問に思っているので)
a20 2015

回答:


124

ユーザーが/loginまたは/にアクセスしたときに何をしたいかはわかりませんが、それらに対して個別のルートを作成できます。キャッチオールの前にそれらを宣言すると、着信要求の処理時に最初のディブを取得します。

app.get('/login', function(req, res) {
  ...
});

app.get('/', function(req, res) {
  ...
});

app.get('*', function(req, res) {
  ...
});

1
これは「GET」の権利に対してのみ機能しますか?何らかの理由で、この回答をapp.use(他の方法を含めるために)使用することができません。
SSHこの

4
@SSHThis最新バージョンのExpress(v4)でも、app.use('*', ...)同様に機能するはずだと思います。ただしapp.all('*', ...)、この場合は使用することをお勧めします。
robertklep 2016年

@JulienMartinだけでテストされ、ルックスエクスプレスv4.16.3で期待どおりに動作しますように
robertklep

app.useミドルウェアを追加します。ミドルウェアは、設計上、チェーン内の次のハンドラーにリクエストを渡します(追加の引数を使用next)。
Stijn de Witt

45

除外したいルートの後にいつでもキャッチオールルートを配置できます(robertklepの回答を参照)。

ただし、ルートの順序を気にしたくない場合もあります。この場合でも、やりたいことができます。

app.get('*', function(req, res, next) {
  if (req.url === '/' || req.url === '/login') return next();
  ...
});

1
.get( '*'、function(req、res、next)。–
オリバーディクソン

2
@iLoveUnicornsありがとう!なぜ私の投稿を編集しなかったのですか?
Leonid Beschastny 2015

他のルールがその前にある場合、次に呼び出す必要がありますか?
サンドバーグ2018

1
@Sandburgミドルウェアは、next()実行を次のミドルウェアに渡すために呼び出すか、要求の処理を終了するために何らかの応答を送信する必要があります。そうしないと、リクエストがハングします。スタック内の最後のミドルウェアが呼び出された場合、next()expressはデフォルトの「404NotFound」応答を送信します。呼び出す代わりにnext()、たとえば、res.status(400).end()「400BadRequest」応答で要求処理を終了するように呼び出すことができます。
Leonid Beschastny 2018

23

すべてのリクエストで資格情報または信頼性を検証する場合は、エクスプレスルーティング機能「all」を使用する必要があります。次のように使用できます。

app.all('/api/*', function(req, res, next){
    console.log('General Validations');
    next();
});

ルーティング関連のものの前に配置できます。

この場合、パスとして「/ api / を使用したことに注意してください。必要に応じて、「/」を使用できます。

ここで誰かを助けるのに遅すぎないことを願っています。


10

キャッチオールルートハンドラーを作成する別の方法は次のとおりです。

app.get('/login', function(req, res) {
  //... login page
});
app.get('/', function(req, res) {
  //...index page
});
app.get('/:pageCalled', function(req, res) {
  console.log('retrieving page: ' + req.params.pageCalled);
  //... mypage.html
});

これは、robertklepの(受け入れられた)回答とまったく同じように機能しますが、ユーザーが実際に要求した内容に関する詳細情報を提供します。これで、req.params.pageCalled要求されているページを表すスラッグができました。複数の異なるページがある場合は、ユーザーを適切なページに誘導できます。

このアプローチで(thx @agmin)に注意する1つの落とし穴/:pageCalledは、単一のルートのみをキャッチ/するため/route/1、などは取得されません。/:pageCalled/:subPageCalledより多くのページ(thx @softcode)のように追加のスラッグを使用します。


より良い?本当に?状況が定義を決定するのではないですか?;-)無関係:コメントを残さずに反対票を投じる人々:なんて失礼だ!
ポテルカ2015年

14
このアプローチの巨大なgotchyaは、あります/:pageCalledつだけでルートをキャッチします/、あなたが取得することはできませんので、/route/1など
agmin

また、try / catchで囲んでいない場合、そのページが存在しないとエラーが発生します。
darethas 2016年

@agminだから、解決策は単に追加することではないでしょう/:pageCalled/:subPageCalledか?
ソフトコード2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.