2016-06-27 4 views
0

私はexpressJSルートを設定しようとしています。expressJSルートからパターンを除外する方法

app.route(base + '/inventory/adjustments').get(policy.isAllowed, inventoryChangeCtrl.search); 


    app.route(base + '/inventory/:inventoryId(?!^adjustments$)').get(policy.isAllowed, inventoryCtrl.findById) 

入力に../inventory/adjustments

問題は最初のルートで、それが適切に一致していることですが、コントローラは、他の場所で、私はセットアップdefault route handlerに通って落下することになっているnext()を呼び出しを考えてみましょう。しかし、代わりに次のルートハンドラもマッチします。

これで、正規表現を使用して特定の文字列をそのルートハンドラから除外しようとしていますが、現在は.../inventory/9039309309のような正しい入力には一致しません。

誰もが第2ルートから第1ルートを除外する方法を提案できますか? (そして、デフォルトハンドラのためにnextが呼び出されることを許可します)。

ありがとうございました。

+0

を言っているのは、/ /インベントリに一致している: –

+0

使用リダイレクトをinventory_id nextを呼び出す代わりに。 – Molda

+0

はい@Dave Briand next()を呼び出すため、2番目のルートも最初のリクエストと一致しています。最初のコントローラがレスポンスを返す場合はもちろん呼び出されませんが、すべてのレスポンスが通過するデフォルトのミドルウェアがあります。 –

答えて

0

inventoryIdは常に数値である場合は、試合はより具体的にすることができます。

app.route(base + '/inventory/:inventoryId(\\d+)', ...); 

その方法、それは"adjustments"とは一致しませんし、ルートがトリガされません。

"adjustments"にも一致しないパターンであれば、一致する可能性のある他の特定のパターンにも同じことが適用されます。

EDITinventoryIdはMongoDBのObjectIdであれば、試合になるだろう:あなたは/在庫/調整を得ること

app.route(base + '/inventory/:inventoryId([a-fA-F\\d]{24})', ...); 
+0

inventoryIdは16進文字列です。正確にはmongodbのIDです(これは16進数だと思います)。しかし、私はこの積極的なマッチ手法を試して、それが文字列を除外しようとするよりも効果的かどうかを見ていきます。 –

+0

@RichardG「ObjectId」の – robertklep

+0

とどのようにマッチするかを示すために私の答えを編集しました。 –

関連する問題