私は現在、ユーザーが各リクエストのヘッダーで認証トークンを渡すことを要求するAPIを作成しています。今、私はキャッチオールルートを作成できることを知っています
app.get('/*', function(req,res){
});
しかし、/loginまたはなどの特定のルートを除外するようにするにはどうすればよいの/でしょうか。
私は現在、ユーザーが各リクエストのヘッダーで認証トークンを渡すことを要求するAPIを作成しています。今、私はキャッチオールルートを作成できることを知っています
app.get('/*', function(req,res){
});
しかし、/loginまたはなどの特定のルートを除外するようにするにはどうすればよいの/でしょうか。
回答:
ユーザーが/loginまたは/にアクセスしたときに何をしたいかはわかりませんが、それらに対して個別のルートを作成できます。キャッチオールの前にそれらを宣言すると、着信要求の処理時に最初のディブを取得します。
app.get('/login', function(req, res) {
...
});
app.get('/', function(req, res) {
...
});
app.get('*', function(req, res) {
...
});
app.use(他の方法を含めるために)使用することができません。
app.use('*', ...)同様に機能するはずだと思います。ただしapp.all('*', ...)、この場合は使用することをお勧めします。
app.useミドルウェアを追加します。ミドルウェアは、設計上、チェーン内の次のハンドラーにリクエストを渡します(追加の引数を使用next)。
除外したいルートの後にいつでもキャッチオールルートを配置できます(robertklepの回答を参照)。
ただし、ルートの順序を気にしたくない場合もあります。この場合でも、やりたいことができます。
app.get('*', function(req, res, next) {
if (req.url === '/' || req.url === '/login') return next();
...
});
next()実行を次のミドルウェアに渡すために呼び出すか、要求の処理を終了するために何らかの応答を送信する必要があります。そうしないと、リクエストがハングします。スタック内の最後のミドルウェアが呼び出された場合、next()expressはデフォルトの「404NotFound」応答を送信します。呼び出す代わりにnext()、たとえば、res.status(400).end()「400BadRequest」応答で要求処理を終了するように呼び出すことができます。
キャッチオールルートハンドラーを作成する別の方法は次のとおりです。
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)のように追加のスラッグを使用します。
/:pageCalledつだけでルートをキャッチします/、あなたが取得することはできませんので、/route/1など
/:pageCalled/:subPageCalledか?