5

サイトの一部へのアクセスを防止する認証ミドルウェアを追加しようとしています。

app = express()
    .get('/api/test', function (req, res) { ... })
    .use('/api', function (req, res, next) {
        if (req.param('key')) {
            next();
        } else {
            res.json(401, {
                message : 'Authentication failed'
            });
            res.end();
        }
    })
    .get('/api/data', function (req, res) { ... });

また、/api/data への呼び出しは、最初にキー チェッカーによって処理され、(成功した場合) /api/data ハンドラーによって処理されると予想しています。ただし、代わりに「/api/data」によって最初に処理されるリクエスト。

チェッカーは /api/something_that_does_not_exist では機能するようですが、/api/something_that_exist では機能しないようです。

Express/Connect のドキュメントで何かを見逃したのではないでしょうか?

更新最初の get/post 呼び出しがルーター ミドルウェアを初期化するため、最初に実行されるという事実までこれを追跡しました。

4

1 に答える 1

9

ルートを宣言すると、Expressrouterはアプリのセットアップのその時点でミドルウェアをミドルウェア スタックに挿入します。

あなたの場合、.get('/api/test', ...)キー チェック ミドルウェアを挿入する前に挿入するため、ルーター ミドルウェアが挿入され、(/api/data後で宣言するルートに対しても) 優先され、キー チェッカーが呼び出されることはありません。

以下に 2 つの解決策を示します。

// separate middleware, used for all routes that need checking
var keyChecker = function(req, res, next) {
  ...
};
app.get('/api/test', function(req, res) { ... });
app.get('/api/data', keyChecker, function(req, res) { ... });

// or, as an alternative, create a 'catch-all' route between the routes that don't
// need to be checked, and the ones that should; this will also match non-existing
// routes (like '/api/foobar'), which might or might not be an issue;
app.get('/api/test', function(req, res) { ... });
app.all('/api/*', function(req, res, next) { // 'all' means 'all methods'
  // keychecker code
});
app.get('/api/data', function(req, res) { ... });

/api/test3 番目の解決策は、キー チェック ミドルウェア自体 ( )を明示的にチェックし、一致するかどうかをreq.path === '/api/test'呼び出すことです。next()

于 2013-04-12T15:16:44.807 に答える